【问题标题】:How to set various parameters for Java RMI based communication?如何为基于 Java RMI 的通信设置各种参数?
【发布时间】:2015-07-18 22:45:06
【问题描述】:

在与各种论坛进行客户端-服务器通信时,我无法在客户端计算机上执行远程对象查找。

我收到的错误是 ConnectIOException(NoRouteToHostException),有时是 ConnectException,有时是其他错误。

这不是我想问的。但是,主要关心的是我应该如何设置客户端平台和服务器平台——谈论网络细节——我怀疑这会干扰我的连接。

我的问题:-

  1. 我应该如何在客户端和服务器端编辑我的 /etc/hosts 文件?服务器的 IP-192.168.1.8 和客户端的 IP-192.168.1.100。意思是,我应该在两个文件中添加系统名称:

    192.168.1.8    SERVER-1      # on the server side
    192.168.1.100  CLIENT-1      # on the client side
    

    我应该这样编辑吗?这可能是可能的担忧之一吗?我只是想消除任何留下的疑虑来执行 rmi 通信!

  2. 另外,我还在服务器端使用System.setProperty("java.rmi.server.hostname",192.168.1.8); 设置服务器的主机名属性。我也应该在客户端做同样的事情吗?

  3. 我已经阅读了有关在服务器端和客户端运行 java 程序时设置类路径的信息。我也这样做了,但是,同样的例外。完全没有区别。我已经读到自从 Java 更新 6u45 以来,类路径就不需要包含了!请对此也有所了解...

  4. 如果我遗漏了什么,也请赐教。最好提供简短的想法/资源链接。

【问题讨论】:

    标签: java networking client-server rmi hostname


    【解决方案1】:

    除非您遇到问题,否则您不需要任何这些。最常见的问题是RMI FAQ #A.1中描述的问题,编辑服务器的hosts文件或在服务器JVM中设置java.rmi.server.hostname是解决这个问题的方法。

    “没有到主机的路由”是网络连接问题,不是 RMI 问题,也不是您可以通过代码或系统属性设置解决的问题。

    设置类路径与网络问题无关。

    【讨论】:

    • 我应该在服务器机器上的hosts文件中编辑什么--->给定我的服务器IP---192.168.1.8如下图所示:-192.168.1.8 SERVER-1我也尝试通过执行@987654325 @方法,但徒劳!如果这是唯一的解决方案,那么我认为您的解决方案可能对我没有用,因为没有任何东西可以执行。此外,他们都能够成功地ping 彼此,并且我已经禁用了两个系统上的防火墙。任何新想法,请原谅任何错误......
    • 我已经这样做了,但是,所有这些都不起作用。可能我的服务器无法从配置的本地网络中的名称调用..
    • @asad 你必须照我说的做,不要再做。 “不起作用”不是问题描述。如果您需要帮助,您必须告诉我们您遇到的什么问题。而不是仅仅猜测你必须做什么,忽略你被告知的内容,当你的猜测不起作用时抱怨。
    • 我猜他在使用路由器/调制解调器/其他设置本地网络时遇到问题。最好为local network connection in which machines are accessible from hostnames based on the nameserver call 链接一些资源。我想这是他在第二条评论中提到的主要问题! @EJP。
    • @shekharsuman 不要让我阻止你。我正在回答他提出的问题。
    【解决方案2】:

    这是传输具体类的服务器示例。该类必须存在于具有相同结构的服务器和客户端类路径中

    消息: 公共类 MyMessage 实现 Serializable {

    private static final long serialVersionUID = -696658756914311143L;
    
    public String Title;
    public String Body;
    
    
    public MyMessage(String strTitle) {
        Title = strTitle;
        Body = "";
    }
    
    public MyMessage() {
        Title = "";
        Body = "";
    }
    

    }

    这是获取消息并返回另一条消息的服务器代码:

    公共类 SimpleServer {

    public String ServerName;
    ServerRemoteObject mRemoteObject;
    
    public SimpleServer(String pServerName) {
        ServerName = pServerName;
    }
    
    public void bindYourself() {
        try {
            mRemoteObject = new ServerRemoteObject(this);
            java.rmi.registry.Registry iRegistry = LocateRegistry.getRegistry(RegistryContstants.RMIPort);
            iRegistry.rebind(RegistryContstants.CMName, mRemoteObject);
        } catch (Exception e) {
            e.printStackTrace();
            mRemoteObject = null;
        }
    }
    
    public MyMessage handleEvent(MyMessage mMessage) {
        MyMessage iMessage = new MyMessage();
        iMessage.Body = "Response body";
        iMessage.Title = "Response title";
        return iMessage;
    }
    
    public static void main(String[] server) {
    
        SimpleServer iServer = new SimpleServer("SERVER1");
        iServer.bindYourself();
    
        while (true) {
            try {
                Thread.sleep(10000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    }

    这里是服务器远程对象的远程接口:

    公共接口 ISimpleServer 扩展 java.rmi.Remote{

    public MyMessage doaction(MyMessage message) throws java.rmi.RemoteException;
    

    }

    您只需要在服务器和客户端类路径中添加 MyMessage 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      • 2012-07-27
      相关资源
      最近更新 更多