在测试RMI远程方法调用时,客户端程序和服务器端程序连接不通,关键代码如下:CalculatorServer:
      Calculator cal = new CalculatorImpl();
      Context context = new InitialContext();
      context.bind("rmi://localhost:1099/CalculatorService",cal);

      System.out.println("Server started...");CalculatorClient:
      Context context = new InitialContext();
      Calculator cal = (Calculator)context.lookup("rmi://118.228.151.231:1099/CalculatorService");

      System.out.println(cal.add(10,5));
      System.out.println(cal.sub(10,5));
      System.out.println(cal.mul(10,5));
      System.out.println(cal.div(10,5));
当客户端程序和服务器端程序位于同一台机器并且把客户端rmi设为localhost:1099时可以连接并调用方法得到正确返回值,但是只要把客户端rmi改为当前主机IP就连接不通了,把客户端程序和服务器端程序分置在两台机器上后就更连不通了,但报的都是一样的错。报错如下:
D:\java\RMI>start rmiregistryD:\java\RMI>start java CalculatorServerD:\java\RMI>java CalculatorClient
Exception in thread "main" javax.naming.ServiceUnavailableException [Root except
ion is java.rmi.ConnectException: Connection refused to host: 118.228.151.231; n
ested exception is:
        java.net.ConnectException: Connection timed out: connect]
        at com.sun.jndi.rmi.registry.RegistryContext.lookup(Unknown Source)
        at com.sun.jndi.toolkit.url.GenericURLContext.lookup(Unknown Source)
        at javax.naming.InitialContext.lookup(Unknown Source)
        at CalculatorClient.main(CalculatorClient.java:11)
Caused by: java.rmi.ConnectException: Connection refused to host: 118.228.151.23
1; nested exception is:
        java.net.ConnectException: Connection timed out: connect
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
        at sun.rmi.server.UnicastRef.newCall(Unknown Source)
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        ... 4 more
Caused by: java.net.ConnectException: Connection timed out: connect
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(Unknown Source)
        at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
        at java.net.PlainSocketImpl.connect(Unknown Source)
        at java.net.SocksSocketImpl.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.<init>(Unknown Source)
        at java.net.Socket.<init>(Unknown Source)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown S
ource)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S
ource)
        ... 9 more
我的预期是做出一个服务器端程序提供加减乘除服务,然后客户端程序可以通过调用代理对象上的方法实现对服务器端远程方法的调用,传递过去两个参数并得到相应运算的结果,服务器端程序和客户端程序要位于两台不同的机器上,但就是测试不通,该怎么修改呢?望高手指点!谢谢

解决方案 »

  1.   

    你的客户端和服务器IP地址各是什么,服务器有几个IP?默认绑定第一IP
    还要注意是否有防火墙禁止了1099端口
      

  2.   

    context.bind("rmi://localhost:1099/CalculatorService",cal);
     localhost是你的127.0.0.1 ,改为:
    context.bind("rmi://118.228.151.231:1099/CalculatorService",cal);
    出错吗?
      

  3.   

    rmi我怎么记得都是用Naimg.rebind进行绑定
    Naming.lookup进行查找服务的?!
      

  4.   


    我是在自己的两台机器上测试的,一台做客户机一台做服务器,没搭局域网。客户端IP好像用不到吧?服务器IP是在百度上查到的,不过拨号上网获得的IP是动态IP,好像动态IP不能被访问,问题出在了IP访问这块,就是不知道该怎样进行设置
      

  5.   

    这样也出错的,并且在启动服务器端程序时就报错了,
    设为localhost时正常显示“Server started...”,换成服务器端IP后就是:
    Trouble:javax.naming.ServiceUnavailableException [Root exception is java.rmi.Con
    nectException: Connection refused to host: 112.3.254.118; nested exception is:
            java.net.ConnectException: Connection timed out: connect]
      

  6.   

    rebind是替换掉之前的绑定。服务器端程序需要进行绑定,客户端不需要的吧,客户端只要查找到一个实例对象就行了
      

  7.   

    服务端Naming.rebind/bind都OK客户端Naming.lookup
    -----------
    InitialContext一般在JNDI中才会用到--------------
    你先在同一台机器上跑通再说嘛