我正在学习Java RMI以便我编写和测试这段代码,这里的问题是客户端(notificationSink类)发送消息并向服务器注册自己但服务器(notificationSource类) )没有做任何事情。
此RemoteThingInterface
扩展了Remote
class:
public interface RemoteThingInterface extends Remote{
public void register(NotificationSink sink) throws RemoteException;
public void notifySink(String text) throws RemoteException;
}
这是NotificationSink类:
public class NotificationSink{
private String name;
private static String hostName = "Shine";
private static int serverPort = 2712;
private static String text = (new Date()).toString();
public NotificationSink(String name){
name = this.name;
}
public static void main(String [] args){
RemoteThingInterface rmiserver;
Registry reg;
System.out.println("Sending "+text+" to "+hostName+" through port "+serverPort);
try{
reg = LocateRegistry.getRegistry(hostName, serverPort);
rmiserver = (RemoteThingInterface) reg.lookup("server");
NotificationSink s = new NotificationSink("Eagle 1");
rmiserver.register(s);
rmiserver.notifySink(text);
}catch(RemoteException ex){} catch (NotBoundException ex) {
ex.printStackTrace();
}
}
}
这是NotificationSource
类:
public class NotificationSource extends UnicastRemoteObject implements RemoteThingInterface{
private ArrayList sinks = new ArrayList<>();
int port;
Registry registry;
public NotificationSource() throws RemoteException{
try{
port = 2712;
registry = LocateRegistry.createRegistry(port);
registry.rebind("server", this);
}catch(RemoteException ex){
ex.printStackTrace();
}
}
@Override
public void register(NotificationSink sink) {
sinks.add(sink);
}
public ArrayList getSinks(){
return sinks;
}
@Override
public void notifySink(String text){
System.out.println("new sink registered, he is "+getSinks().get(0));
System.out.println(text);
}
public static void main(String [] args){
try{
NotificationSource s = new NotificationSource();
}catch(Exception e){
e.printStackTrace();
}
}
}
请帮助解释我错在哪里以及如何解决这个问题。我试图添加一些代码来查找服务器中arraylist的大小,它找到了成功,但其他方法不起作用....代码如下:
将此行添加到remotethinginterface:ArrayList getArray() throws RemoteException;
将此行添加到notiSource:
@Override
public ArrayList getArray() throws RemoteException {
return sinks;
}
将此行添加到notiSink:System.out.println(rmiserver.getArray().size());
(rmiserver.register()
答案 0 :(得分:1)
客户端(notificationSink类)发送消息
不,不。
并在服务器上注册自己
不,不。
但是服务器(notificationSource类)没有做任何事情。
为什么要这样?没有客户要求做任何事情。不可能。这是不可能的。
catch(RemoteException ex){}
第一个主要问题在这里。你忽略了RemoteException
。不要那样做。记录它,打印它,永远不要忽略异常,除非你真的知道你在做什么。在这种情况下,您将忽略调用NotSerializableException
时抛出的嵌套register().
第二个主要问题是NotificationSink
需要:
Serializable
,如果您希望在服务器上执行,或UnicastRemoteObject,
。