NaaiT
Legacy Member
hi,
ik ben voor school een p2p-programma aan het schrijven, en werk hiervoor met java RMI.
Nu is het gelukt om connectie tussen client & server te krijgen, maar zit ik met volgend erg eigenaardig probleem:
stel: er staat 1 server op & 10 clients. Deze zijn allemaal zonder problemen geconnecteerd met de server. Client 2,3,...,10 kan ik allemaal afsluiten. Erna kan ik ook nog andere clients bijzetten.
Nu ligt het probleem bij de eerste client die ik opzet: vanaf het moment ik deze afsluit, vernietigt hij blijkbaar het stub-object van de server in die server zijn register. Een registry.lookup("server") werkt dan niet meer. Mijn server is onbonden van zijn register, dus kan ik er niets meer mee aanvangen.
code server:
code client:
error NA het sluiten van client1, en het terug opvragen van de serverstub:
Iemand enige ideetjes? want ik word er allesinds zot van
thx
Sven
ik ben voor school een p2p-programma aan het schrijven, en werk hiervoor met java RMI.
Nu is het gelukt om connectie tussen client & server te krijgen, maar zit ik met volgend erg eigenaardig probleem:
stel: er staat 1 server op & 10 clients. Deze zijn allemaal zonder problemen geconnecteerd met de server. Client 2,3,...,10 kan ik allemaal afsluiten. Erna kan ik ook nog andere clients bijzetten.
Nu ligt het probleem bij de eerste client die ik opzet: vanaf het moment ik deze afsluit, vernietigt hij blijkbaar het stub-object van de server in die server zijn register. Een registry.lookup("server") werkt dan niet meer. Mijn server is onbonden van zijn register, dus kan ik er niets meer mee aanvangen.
code server:
Code:
public class ServerInstance implements ServerInterface, ClientActionListener, ServerActionListener {
/* -- Class Variables ------------------------------------------------------ */
private static ServerInstance instance = null;
private ExecutorService threadPool = Executors.newCachedThreadPool();
private Boolean serverInitialized = false;
private Boolean publicationServerInitialized = false;
private Registry rmiRegistry;
private Set<ServerActionListener> listeners = new HashSet<ServerActionListener>();
/* -- Constructors --------------------------------------------------------- */
protected ServerInstance(ServerActionListener parent, String sName, String sPort, String publisherPort) {
if(parent!=null)
addServerActionListener(parent);
setUpRegistry();
if(validateServer(sName, sPort))
setUpServer();
}
/* -- Singleton Pattern ---------------------------------------------------- */
public static ServerInstance getInstance() {... }
public static void stopInstance() {
if(instance!=null)
instance.stopServer();
}
/* -- Actions -------------------------------------------------------------- */
private void setUpRegistry() {
try {
rmiRegistry = LocateRegistry.createRegistry(Config.getInstance().getDefaultRMIPort());
}
catch (RemoteException ex) {
/* registry already existed on this machine, so connect to it */
try {
rmiRegistry = LocateRegistry.getRegistry(Config.getInstance().getDefaultRMIPort());
}
catch (RemoteException re) {
toConsole(ServerAction.NOTIFY, "Error creating RMI registry.");
}
}
}
private boolean validateServer(String sName, String sRMI) { ...
Config.getInstance().getThisServerStatus().resetServerStatus(sName, sRMI);
return true;
}
private void setUpServer() {
try {
/* Export ServerInstance */
ServerInterface stub = (ServerInterface) UnicastRemoteObject.exportObject(this, 0);
rmiRegistry.rebind(Config.getInstance().getThisServerStatus().getServerRMI(), stub);
toConsole(ServerAction.INITIALIZED, "Server up & running.");
serverInitialized = true;
}
catch (RemoteException ex) {
toConsole(ServerAction.CRASH, "Failed to create server on virtual port \"" + Config.getInstance().getThisServerStatus().getServerRMI() + "\". Please try an other one.");
}
}
private void stopServer() {
/* unbind the server stub */
try {
rmiRegistry.unbind(Config.getInstance().getThisServerStatus().getServerRMI());
}
catch (Exception ae) {
toConsole(ServerAction.CRASH, "Failed to close server on virtual port \"" + Config.getInstance().getThisServerStatus().getServerRMI() + "\".");
}
/* server stopped successfully */
toConsole(ServerAction.CRASH, "Server crashed by user.");
}
/* -- Remote Actions ------------------------------------------------------- */
public String sayHello() { // remark: no throws clause!
return "Hello, world!";
}
/* -- Events --------------------------------------------------------------- */
...
}
code client:
Code:
public class ConnectionToServer {
/* -- Class Variables ------------------------------------------------------ */
private String serverIP = null;
private String serverRMI = null;
private Integer clientIDAtServer = null;
private ServerInterface stub = null;
private boolean serverInitialized = false;
private Set<ConnectionActionListener> listeners = new HashSet<ConnectionActionListener>();
/* -- Constructors --------------------------------------------------------- */
public ConnectionToServer(ConnectionActionListener parent, String sName, String sRMI) {
addConnectionActionListener(parent);
if(validateServer(sName, sRMI))
retrieveServerStub();
removeConnectionActionListener(parent);
}
/* -- Actions -------------------------------------------------------------- */
private boolean validateServer(String sName, String sRMI) {...}
private void retrieveServerStub() {
/* local variables */
Registry rmiRegistry;
try {
rmiRegistry = LocateRegistry.getRegistry(serverIP.toString(), Config.getInstance().getDefaultRMIPort());
stub = (ServerInterface) rmiRegistry.lookup(serverRMI);
toConsole(ConnectionAction.CONNECTED, "Connected to server " + serverIP + ":" + serverRMI + ".");
}
catch (Exception e) {
toConsole(ConnectionAction.DISCONNECTED, "Failed to contact server " + serverIP + ":" + serverRMI + ".");
e.printStackTrace();
}
}
/* -- Remote Actions ------------------------------------------------------- */
...
/* -- Events --------------------------------------------------------------- */
...
}
error NA het sluiten van client1, en het terug opvragen van de serverstub:
Code:
java.rmi.NotBoundException: SERV
at sun.rmi.registry.RegistryImpl.lookup(Unknown Source)
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at p2pClient.io.ConnectionToServer.retrieveServerStub(ConnectionToServer.java:69)
at p2pClient.io.ConnectionToServer.<init>(ConnectionToServer.java:35)
at p2pClient.gui.ClientMainPanel.setUpServer(ClientMainPanel.java:190)
at p2pClient.gui.ClientMainPanel.access$2(ClientMainPanel.java:183)
at p2pClient.gui.ClientMainPanel$3.actionPerformed(ClientMainPanel.java:148)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at org.jvnet.substance.utils.RolloverButtonListener.mouseReleased(RolloverButtonListener.java:110)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Iemand enige ideetjes? want ik word er allesinds zot van

thx
Sven

