Java RMI:ConnectException:连接超时:连接

Java RMI:ConnectException:连接超时:连接,java,connection,rmi,connectexception,Java,Connection,Rmi,Connectexception,我意识到这个问题已经被问了很多次,也被回答了很多次(通常来自EJP,他很清楚自己的能力!),但我仍然在挣扎 我“偷”了一个简单的RMI添加服务器和客户端。 (谢谢, 然后,谁又对P.诺顿和H.席尔德的《Java 2:完整参考》第24章给予了肯定。) 无论我尝试什么,我仍然会遇到“连接超时”异常。 有人能看出我做错了什么吗 我怀疑防火墙出了什么问题,但如果是这样,我不知道该告诉我的IT人员如何修复和更改 提前谢谢 接口: public interface AddServerIntf extends

我意识到这个问题已经被问了很多次,也被回答了很多次(通常来自EJP,他很清楚自己的能力!),但我仍然在挣扎

我“偷”了一个简单的RMI添加服务器和客户端。 (谢谢, 然后,谁又对P.诺顿和H.席尔德的《Java 2:完整参考》第24章给予了肯定。)

无论我尝试什么,我仍然会遇到“连接超时”异常。 有人能看出我做错了什么吗

我怀疑防火墙出了什么问题,但如果是这样,我不知道该告诉我的IT人员如何修复和更改

提前谢谢

接口:

public interface AddServerIntf extends Remote {
    double add(double d1, double d2) throws RemoteException;
}
服务器:

public class SimpleRMIExServer {
    public static void main(String[] args) throws Exception {    
        System.out.println("Class name " + SimpleRMIExServer.class.getSimpleName());
        System.out.println("Path " + System.getProperty("user.dir"));
        System.setProperty("java.rmi.server.codebase",
                "file:///D:\\SimpleRMIExample\\lib\\SimpleRMIExample.jar");
        Registry registry;
        try {
            registry = LocateRegistry.createRegistry(1099);
        } catch (RemoteException remoteException) {
            registry = LocateRegistry.getRegistry(1099);
        }
        AddServerImpl addServerImpl = new AddServerImpl();
        registry.bind("AddServer", addServerImpl);
        System.out.println("Located Registry " + registry.toString());
        for (String boundName : registry.list()) {
            System.out.println("Name bound: " + boundName);
        }
        Naming.rebind("SERVERNAME", addServerImpl);
        System.out.println("Registry: " + registry);
        System.out.println("");
        System.out.println("Remote: " + addServerImpl);
    }    
}
public class AddServerImpl extends UnicastRemoteObject implements AddServerIntf {
    public AddServerImpl() throws RemoteException {
    }

    @Override
    public double add(double d1, double d2) throws RemoteException {
        return d1 + d2;
    }
}
客户:

public class SimpleRMIExClient {
   public static void main(String[] args) throws Exception {
     final Registry registry = LocateRegistry.getRegistry("SERVERNAME", 1099);
     AddServerIntf addServerIntf = (AddServerIntf) registry.lookup("AddServer");
     System.out.println("The first number is: " + 10);
     double d1 = Double.valueOf(10).doubleValue();
     System.out.println("The second number is: " + 15);
     double d2 = Double.valueOf(15).doubleValue();
     System.out.println("The sum is: " + addServerIntf.add(d1, d2)); //Exception occurs here.
   }
}
来自服务器的输出:

D:\>java -jar SimpleRMIExServer.jar
Class name SimpleRMIExServer
Path D:\
Located Registry RegistryImpl[UnicastServerRef [liveRef: [endpoint:[XX.XX.XX.XX:
1099](local),objID:[0:0:0, 0]]]]
Name bound: AddServer
Registry: RegistryImpl[UnicastServerRef [liveRef: [endpoint:[XX.XX.XX.XX:1099](l
ocal),objID:[0:0:0, 0]]]]

Remote: AddServerImpl[UnicastServerRef [liveRef: [endpoint:[XX.XX.XX.XX:54119](l
ocal),objID:[2a7202aa:14492e5ea89:-7fff, -5034491972061237368]]]]
来自客户端的输出:

debug:
The first number is: 10
The second number is: 15
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: XX.XX.XX.XX; nested exception is: 
    java.net.ConnectException: Connection timed out: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
    at com.sun.proxy.$Proxy0.add(Unknown Source)
    at com.sun.proxy.$Proxy0.add(Unknown Source)
    at simplermiexclient.SimpleRMIExClient.main(SimpleRMIExClient.java:35)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at java.net.Socket.connect(Socket.java:528)
    at java.net.Socket.<init>(Socket.java:425)
    at java.net.Socket.<init>(Socket.java:208)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
    ... 7 more
Java Result: 1
BUILD SUCCESSFUL (total time: 1 minute 33 seconds)
(在许多其他行中) 我还看到:

LocalAddress       ForeignAddress    State
XX.XX.XX.XX:54138   SERVERNAME:1099  TIME_WAIT
编辑: 我试着加入:

System.setProperty("java.rmi.server.hostname", "SERVERNAME");
在设置codebase系统属性之后,根据EJP向许多其他人推荐的阅读Java RMI FAQ A.1的建议,立即发送到服务器

当我这样做时,这是堆栈跟踪:

debug:
The first number is: 10
The second number is: 15
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: SERVERNAME; nested exception is: 
    java.net.ConnectException: Connection timed out: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
    at com.sun.proxy.$Proxy0.add(Unknown Source)
    at com.sun.proxy.$Proxy0.add(Unknown Source)
    at simplermiexclient.SimpleRMIExClient.main(SimpleRMIExClient.java:35)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at java.net.Socket.connect(Socket.java:528)
    at java.net.Socket.<init>(Socket.java:425)
    at java.net.Socket.<init>(Socket.java:208)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
    ... 7 more
Java Result: 1
BUILD SUCCESSFUL (total time: 1 minute 15 seconds)
调试: 第一个数字是:10 第二个号码是:15 线程“main”java.rmi.ConnectException中出现异常:拒绝连接到主机:SERVERNAME;嵌套异常是: java.net.ConnectException:连接超时:连接 位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) 位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) 位于sun.rmi.transport.tcp.tcpcchannel.createConnection(tcpcchannel.java:216) 位于sun.rmi.transport.tcp.tcpcchannel.newConnection(tcpcchannel.java:202) 位于sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129) 位于java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194) 位于java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148) 位于com.sun.proxy.$Proxy0.add(未知源) 位于com.sun.proxy.$Proxy0.add(未知源) 位于simplermexcient.simplermexcient.main(simplermexcient.java:35) 原因:java.net.ConnectException:连接超时:连接 位于java.net.DualStackPlainSocketImpl.connect0(本机方法) 位于java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) 位于java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 位于java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 位于java.net.socksocketimpl.connect(socksocketimpl.java:392) 位于java.net.Socket.connect(Socket.java:579) 位于java.net.Socket.connect(Socket.java:528) 位于java.net.Socket。(Socket.java:425) 位于java.net.Socket(Socket.java:208) 位于sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) 位于sun.rmi.transport.proxy.rmismastersocketfactory.createSocket(rmismastersocketfactory.java:147) 位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) ... 还有7个 Java结果:1 构建成功(总时间:1分15秒) 回答我自己的问题: 我已经找到了问题的答案。我喜欢看到别人这样做,能自己说出来很好

我的最终解决方案是防火墙问题,但我想为任何人提供建议,让他们知道我是如何解决我的问题的

  • 分解它。将我的代码放在上面,它实际上不是我的代码,制作一个更简单的RMI服务器版本并进行测试

  • 从小处做起,一步步向上。从本地主机开始,确保其正常工作,然后在单独的PC上测试(我有一台虚拟PC),然后在服务器上测试

  • 寻求帮助
  • 我意识到我在这里所说的并不是什么新鲜事,我知道我已经听过很多次了,但有时需要听上千次才能最终接受。虽然我的孩子们还没学会

    祝你好运。

    (由问题编辑回答。转换为社区wiki答案。请参阅)

    OP写道:

    回答我自己的问题:我已经找到了问题的答案。我喜欢看到别人这样做,能自己说出来很好

    我的最终解决方案是防火墙问题,但我想为任何人提供建议,让他们知道我是如何解决我的问题的

  • 把它分解。把我的代码放在上面,那真的不是我的代码 一个更简单的RMI服务器版本,并对其进行测试

  • 从小处做起,一路向上。从本地主机开始确保 这是可行的,然后在一台单独的PC上测试(我有一台虚拟PC),然后 在服务器上进行测试

  • 寻求帮助
  • 我意识到我在这里所说的并不是什么新鲜事,我知道我已经听过很多次了,但有时需要听上千次才能最终接受。虽然我的孩子们还没学会

    祝你好运

    debug:
    The first number is: 10
    The second number is: 15
    Exception in thread "main" java.rmi.ConnectException: Connection refused to host: SERVERNAME; nested exception is: 
        java.net.ConnectException: Connection timed out: connect
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129)
        at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
        at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
        at com.sun.proxy.$Proxy0.add(Unknown Source)
        at com.sun.proxy.$Proxy0.add(Unknown Source)
        at simplermiexclient.SimpleRMIExClient.main(SimpleRMIExClient.java:35)
    Caused by: java.net.ConnectException: Connection timed out: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:579)
        at java.net.Socket.connect(Socket.java:528)
        at java.net.Socket.<init>(Socket.java:425)
        at java.net.Socket.<init>(Socket.java:208)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
        ... 7 more
    Java Result: 1
    BUILD SUCCESSFUL (total time: 1 minute 15 seconds)