我有許多客戶端連接到的RMI服務器。當客戶註冊更改時,服務器會作出反應並指示所有客戶進行更改。如何在沒有註冊客戶端的情況下製作RMI服務器多客戶端程序
我一直在尋找一些hello world RMI的例子,但沒有一個解決了如何從服務器持久地連接客戶端。
我想實現的是沿着這些方向的東西: 服務器在rmiregistry上註冊。 客戶端1連接到服務器並調用服務器上的方法。 客戶端2連接到服務器並調用服務器上的方法。 服務器將更改從client2發送到client1。
如何在不將每個客戶端註冊爲服務器的情況下實現這一目標?
編輯:沒有找到stub類: 看着幾個優秀ansvers的(奉承奉承)我遇到以下異常 java.rmi.StubNotFoundException後thegame.connectivity.GameClient_Stub;嵌套的例外是:
java.lang.ClassNotFoundException: thegame.connectivity.GameClient_Stub
at sun.rmi.server.Util.createStub(Util.java:292)
at sun.rmi.server.Util.createProxy(Util.java:140)
at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:196)
at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:310)
at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:237)
at thegame.connectivity.GameClient.bind(GameClient.java:37)
at thegame.connectivity.GameClient.run(GameClient.java:51)
at thegame.connectivity.GameClient.main(GameClient.java:29)
Caused by: java.lang.ClassNotFoundException: thegame.connectivity.GameClient_Stub
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at sun.rmi.server.Util.createStub(Util.java:286)
... 7 more
在這個類
public class GameClient extends Thread implements Remote, Client, ModelChangeListener<Client>{
private static final long serialVersionUID = -394039736555035873L;
protected Queue<GameModelEvent> queue = new ConcurrentLinkedQueue<GameModelEvent>();
public GameClient(){
}
public static void main(String[] args){
GameClient client = new GameClient();
client.run();
}
protected void bind(){
System.setProperty("java.rmi.server.codebase","file:bin/");
try {
Registry registry = LocateRegistry.getRegistry();
Client c = (Client)UnicastRemoteObject.exportObject(this);
Server stub = (Server) registry.lookup("Server");
stub.registerClient(c);
} catch (RemoteException | NotBoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
super.run();
bind();
while(!Thread.interrupted()){
System.out.print(".");
GameModelEvent event = queue.poll();
while(event != null){
System.out.println(event);
event = queue.poll();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
return;
}
}
}
...
它運作良好,當我註釋掉UnicatRemoteObject,只是傳遞null作爲參數。所以有一個連接,一切都在運行。但沒有存根... 註釋掉代碼庫也沒有效果。代碼庫在服務器上正常工作。
有什麼不對?
這可能幫助:http://java.sys-con.com/node/46979 –