2015-06-23 156 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