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:
Ü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:
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.
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:
Code:
...
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);
}
}
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:
Code:
...
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.