远程服务器不响应客户端请求 - 使用Java RMI

时间:2013-12-10 23:18:52

标签: java rmi

我正在学习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()

之前

1 个答案:

答案 0 :(得分:1)

  

客户端(notificationSink类)发送消息

不,不。

  

并在服务器上注册自己

不,不。

  

但是服务器(notificationSource类)没有做任何事情。

为什么要这样?没有客户要求做任何事情。不可能。这是不可能的。

catch(RemoteException ex){}

第一个主要问题在这里。你忽略了RemoteException。不要那样做。记录它,打印它,永远不要忽略异常,除非你真的知道你在做什么。在这种情况下,您将忽略调用NotSerializableException时抛出的嵌套register().

第二个主要问题是NotificationSink需要:

  1. 实施Serializable,如果您希望在服务器上执行,或
  2. 如果您希望在客户端执行,请实现远程接口并扩展UnicastRemoteObject,