2014-09-03 192 views
0

我對如何讓我的客戶端發送對象到服務器有一個理解問題。 所以我稱之爲 「RMIInterface」 和客戶端 「RMIClient」 和服務器的一個接口 「的RMIServer」 類:RMI:客戶端發送消息給服務器

RMIInterface

public interface RMIInterface extends Remote { 

    public String getMessage(String text) throws RemoteException; 

} 

RMIClient

public class RMIClient { 

    private void connectToServer() { 
     try { 
      Registry registry = LocateRegistry.getRegistry("127.0.0.1", 1099); 
      RMI rmi = (RMI) registry.lookup("server"); 
      System.out.println("Connected to Server"); 

      String text = rmi.getMessage("RMITest Message"); 
      System.out.println(text); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 

    } 

    public static void main(String[] args) { 
     RMIClient client = new RMIClient(); 
     client.connectToServer(); 
    } 

} 

的RMIServer

public class RMIServer extends UnicastRemoteObject implements RMIInterface { 

    public RMIServer() throws RemoteException { 
     super(); 
    } 

    @Override 
    public String getMessage(String text) throws RemoteException { 
     return "Your message is: " + text; 
    } 

    public static void main(String[] args) { 
     try { 
      Registry registry = LocateRegistry.createRegistry(1099); 
      registry.rebind("server", new RMIServer()); 
      System.out.println("Server started!"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

使用此程序,我可以使用客戶端連接到服務器,並在客戶端控制檯中打印消息。 我的問題是,我怎樣才能將消息從客戶端發送到服務器,並在服務器控制檯輸出中打印該消息?請提供最簡單的代碼示例

回答

0

只需添加一個sendMessage()方法到您的界面。

+0

好的,但我怎樣才能連接到服務器,併發送對象到該方法內的服務器?我應該在sendMessage()中寫什麼代碼? – Alex230 2014-09-03 20:12:12

+0

你能否給我一個代碼,然後我可以接受你的答案。謝謝! – Alex230 2014-09-03 20:21:41

+0

快來吧。我已經告訴過你該怎麼做。我期望任何有能力的程序員都能夠把它變成一個方法聲明。 – EJP 2014-09-03 23:34:00

0

我不會爲您提供代碼,因爲您已擁有它。我會給你提供一個解決方案:

你已經有一個「通道」,你發送一個單向消息,SERVER-> CLIENT。 如果你想從你的服務器發送一條消息到你的客戶端,你的CLIENT也必須是一個SERVER。

+0

他想從客戶端發送消息到SERV呃。他已經從服務器發送消息給客戶端,這反駁了你的最後一句話。 – EJP 2014-09-03 20:06:20

2

雖然已經過了一年多了,但如果有人來這裏尋找解決問題的方法,我會分享解決方案,就像我昨天所做的那樣。

RMIInterface

import java.rmi.*; 

public interface RMIInterface extends Remote { 

    public void sendMessage(String text) throws RemoteException; 

    public String getMessage(String text) throws RemoteException; 

} 

RMIClient

import java.rmi.*; 
import java.rmi.registry.*; 

public class RMIClient { 

    public static void main(String[] args) { 

     String text = "RMI Test Message"; 
     RMIInterface rmi = null; 

     try { 
      Registry registry = LocateRegistry.getRegistry("127.0.0.1", 1099); 
      rmi = (RMIInterface) registry.lookup("server"); 
      System.out.println("Connected to Server"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     if (rmi != null) { 
      try { 
       rmi.sendMessage(text); 
       System.out.println(rmi.getMessage(text)); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
      System.out.println("Finished"); 
     } 
    } 
} 

的RMIServer

import java.rmi.*; 
import java.rmi.registry.*; 
import java.rmi.server.*; 

public class RMIServer implements RMIInterface { 

    @Override 
    public void sendMessage(String s) throws RemoteException { 
     System.out.println(s); 
    } 

    @Override 
    public String getMessage(String text) throws RemoteException { 
     return "Your message is: " + text; 
    } 

    public static void main(String[] args) { 
     Registry reg = null; 
     try { 
      reg = LocateRegistry.createRegistry(1099); 
     } catch (Exception e) { 
      System.out.println("ERROR: Could not create the registry."); 
      e.printStackTrace(); 
     } 
     RMIServer serverObject = new RMIServer(); 
     System.out.println("Waiting..."); 
     try { 
      reg.rebind("server", (RMIInterface) UnicastRemoteObject.exportObject(serverObject, 0)); 
     } catch (Exception e) { 
      System.out.println("ERROR: Failed to register the server object."); 
      e.printStackTrace(); 
     } 
    } 
} 
相關問題