2015-06-23 77 views
2

我正在写一个java程序,我使用rmi进行网络通信。我导出一个远程对象,更多的客户端可以连接。该对象包含一个返回另一个远程对象的方法,对于每个客户端都不相同。返回的对象包含两个LinkedBlockingQueue。当连接多个客户端时,似乎他们从同一队列中获取消息。 这里,第一接口Java RMI和队列问题

public interface RMIInterface extends Remote { 
    public ConnectionInterface createConnection() throws RemoteException; 
} 

这是第一对象

public class RMIImplementation extends UnicastRemoteObject implements RMIInterface { 
    @Override 
    public ConnectionInterface createConnection() throws RemoteException { 
     ... 
    } 

} 

这是第二个接口

public interface ConnectionInterface extends Remote { 
    public void sendMessage (Message info) throws RemoteException; 

    public Message getMessage() throws RemoteException; 
} 

这是第二个对象

public class RMIConnection implements ConnectionInterface{ 

    private LinkedBlockingQueue<Message> in; 
    private LinkedBlockingQueue<Message> out; 

    ServerRMIConnection() { 
     in = new LinkedBlockingQueue<Message>(); 
     out = new LinkedBlockingQueue<Message>(); 

     try { 
      UnicastRemoteObject.exportObject(this, 0); 
     } catch (RemoteException e) { 
     } 
    } 

    @Override 
    public void sendMessage (Message info){ 
     in.offer(info); 
    } 

    @Override 
    public Message getMessage() { 
     Message message=null; 
     try { 
      info = out.poll(120, TimeUnit.SECONDS); 
     } catch (InterruptedException e) { 
     } 

     return message; 
    } 
} 

W¯¯当两个或更多客户端调用getMessage方法时,它们会收到相同的消息。有任何想法吗?

+0

你确定你正在为每个客户端创建一个新的'RMIConnection'对象吗? – EJP

+0

当然,我用这个语句:return new RMIConnection(); – Davide

回答

1

由于您忽略了调用exportObject()的异常,因此可能会失败。永远不要这样做。打印异常。

+0

没有在exportObject()中失败,当我打印它时 – Davide