# RMI Chat Problem, Client bekannt machen



## SBS (10. Jul 2006)

Hallo,

ich arbeite an einem RMI Chat.

Ich habe Klassen, die die Verbindung herstellen, Client_Connect und Server_Connect.

Weiterhin habe ich INterfaces Client_Interface und Server_Interface.

Mein Server hostet eine registry an der sich der Client anmeldet.

Die Client_Connect implementiert das Client_Interface, das sieht in etwa soaus:


```
...
public class Client_Connect implements Client_Interface, IConnect
{
	
	  protected  Client_InferfaceUI clientGUI;
	  protected Server_Interface server;	  
	  protected Message content;	  

	 protected InetAddress localhost = null;
	 protected Client current_client = null;

	  public Client_Connect(Client_InferfaceUI clientGUI) throws RemoteException
	  {
	    //
	    super();
	    //
	    this.clientGUI = clientGUI;
	    clientGUI.registerClient(this);
	    //
	    server = null;
	    //
	  }

	  public void registering()
	  {
		  
		  		try
				{
					localhost = InetAddress.getLocalHost();
				}
				catch (UnknownHostException e) {
					// TODO Auto-generated catch block
					System.out.println(e);
				}
				current_client = new Client();
				current_client.setName(localhost.getHostName());
				current_client.setIp(localhost.getHostAddress());		
	  }

	  public boolean initConnection(String host, int port, String service, Client_Interface client)
	  {

	    try
	    {
	      String connectString = "rmi://" + host + ":" + port + "/" + service;
	      Registry registry = LocateRegistry.getRegistry(host, port);

             //Hier wird das Server_Interface festgelegt, über welches kommuniziert wird.

	      server = (Server_Interface) (registry.lookup(service));
	      
	     registering();
	     server.connect(current_client);
	    }
	    catch (Exception e)
	    {
	    	System.out.println(e.toString());
	      return false;
	    }
	    return true;
	  }

	  public void setContentAtServer(Message content)
	  {
	    if (null == content)
	    {
	      return;
	    }
	    //
	    // update the server
	    try
	    {
	      server.setContent(content);
	    }
	    catch (NullPointerException e1)
	    {
	      System.out.println(e1.toString());
	    }
	    catch (RemoteException e2)
	    {
	      System.out.println(e2.toString());
	    }
	  }

	  public void setContent(Message content)
	  {
	    clientGUI.updateContent(content);
	  }
}
```
Über server = (Server_Interface) (registry.lookup(service));
hole ich mir den entsprechenden Serverdienst aus der Registry.
Mit dem Aufruf server.setContent(content); in der SetContentAtServer Methode kann ich wunderbar an den Server den Inhalt schicken.

analog dazu habe ich das in der Server_Connect implementiert um zum Client zu connecten:


```
...
public class Server_Connect
  extends UnicastRemoteObject
  implements Server_Interface, IConnect
{
	private static final long serialVersionUID = 4259388142613515938L;

  protected Message content;
  protected Server_InterfaceUI serverGUI;  
  protected Client_Interface client;

  public Server_Connect(Server_InterfaceUI serverGUI) throws RemoteException
  {
    //
    super();
    //
    this.serverGUI = serverGUI;
    serverGUI.registerServer(this);    
    //
    setContent(new Message("Welcome, Server is online..."));
    //
    initRMI();
    //
  }

  protected void initRMI()
  {
    try
    {
      //
      // create the registry object using LocateRegistry
      Registry registry = LocateRegistry.createRegistry(RMI_PORTNUMBER);
      System.out.println("Registry created");   
      //
      // Server an Registry anmelden
      registry.rebind(RMI_SERVICENAME, this);
    }
    catch (Exception e)
    {
      System.out.println(e.toString());
    }
  }

  public void setContent(Message content) throws RemoteException
  {
    if (null == content)
    {
      return;
    }
    //
    // update the content
    this.content = content;
    //
    // update the GUI
    serverGUI.updateContent(content);
  }

  
  public void setContentAtClient(Message content) 
  {
    if (null == content)
    {
      return;
    }
    //
    // update the server
    try
    {
      client.setContent(content);
    }
    catch (NullPointerException e1)
    {
    	System.out.println(e1.toString());
    }
  }

public void connect(Client current_client) throws RemoteException {
	
	serverGUI.register_Client(current_client);
	
	// TODO Auto-generated method stub
	
}
  
}
```


Wenn ich nun versuche eine Nachricht an den Client vom Server aus zu schicken, erhalte ich eine NullPointerException, der Grund dafür ist anscheinend, dass mein client Objekt (Typ Client_Interface) nirgendwo festgelegt wurde. (Zeile 70 )

Wie lege ich dieses Objekt nun fest?
Bei Client habe ich ein solches Objekt server_interface (Typ Server_Interface) ja über server = (Server_Interface) (registry.lookup(service)); festgelegt.

Wie lege ich nun mein client Objekt in meiner Server_Connect.java fest?

Vielen Dank schonmal!

PS: Sorry für den vielen Code, hoffe es hat was genützt, dass jemand das Problem versteht.
Bei "helfendem" Interesse, stelle ich das ganze gerne auch als .zip irgendwie zu Verfügung.


----------



## Kola (11. Jul 2006)

Beim Verbinden erhält der Server die nötigen Informationen über den Client. Am besten mal die Beispiele in einem Buch anschauen.
Vielleicht möchtest du ja auch ein Peer-to-peer chat-programm schreiben, dann solltest du unter "JXTA" suchen.


----------



## Natorion (11. Jul 2006)

bzw such nach callbackhandler/object. das ist das was du brauchst.


----------

