首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java : ConnectException:连接超时:连接

Java : ConnectException:连接超时:连接
EN

Stack Overflow用户
提问于 2014-03-05 16:31:26
回答 1查看 7.1K关注 0票数 1

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

我“偷”了一个简单的RMI添加服务器和客户端。(谢谢http://www.scs.ryerson.ca/mes/courses/cps530/programs/rmi/Schildt/addTwoNumbers.html,他随后赞扬了P.Naughton和H.Schildt的“Java2:完整参考”第24章。)

无论我如何尝试,我仍然会得到这个“连接超时”异常。有人能看到我做错了什么吗?

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

提前感谢!

接口:

代码语言:javascript
复制
public interface AddServerIntf extends Remote {
    double add(double d1, double d2) throws RemoteException;
}

服务器:

代码语言:javascript
复制
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;
    }
}

客户端:

代码语言:javascript
复制
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.
   }
}

服务器的输出:

代码语言:javascript
复制
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]]]]

客户的输出:

代码语言:javascript
复制
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)

此外,我使用了命令netstat -a,它显示了:

代码语言:javascript
复制
LocalAddress       ForeignAddress    State
0.0.0.0:1099       SERVERNAME:0      LISTENING
[::]:1099          SERVERNAME:0      LISTENING
XX.XX.XX.XX:53373  SERVERNAME:1099   ESTABLISHED

(在许多其他台词中)我也看到:

代码语言:javascript
复制
LocalAddress       ForeignAddress    State
XX.XX.XX.XX:54138   SERVERNAME:1099  TIME_WAIT

编辑:我尝试添加:

代码语言:javascript
复制
System.setProperty("java.rmi.server.hostname", "SERVERNAME");

在设置代码基系统属性之后,根据EJP对这么多其他人的建议来读取Java A.1。

当我这么做的时候,这是堆栈跟踪:

代码语言:javascript
复制
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)

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

我的最后一个解决方案是防火墙问题,但我想就如何解决我的问题向在场的任何人提供建议。

  1. 分解它。把上面的代码拿出来,这实际上不是我的代码,并制作了一个简单得多的RMI服务器版本,并对其进行测试。
  2. 从小到向上,从本地主机开始,确保它工作,然后在单独的PC上进行测试(我有一个虚拟PC),然后在服务器上进行测试。
  3. 寻求帮助!,我在网上搜索了很多。谢谢你,EJP!而且,一旦我终于让它在虚拟PC上工作,而不是在服务器上工作,那么我就让我的it人员参与其中,他们发现两者之间有区别。“在PC上有一个防火墙设置,它与服务器上没有设置的Java相关。”- IT Guy (参见:http://windows.microsoft.com/en-us/windows/communicate-through-windows-firewall#1TC=windows-7)

我意识到我在这里说的不是什么新鲜事,我知道我听过很多次,但有时需要听上千次才能最终接受。虽然对我的孩子们还没有起作用。;-)

祝好运。

EN

回答 1

Stack Overflow用户

发布于 2015-02-05 16:21:19

(由问题编辑回答。转换成社区wiki的答案。见Question with no answers, but issue solved in the comments (or extended in chat) )

“任择议定书”写道:

回答我自己的问题:我已经找到了我的问题的答案。我喜欢看到别人这么做,我很高兴能自己说出来。 我的最后一个解决方案是防火墙问题,但我想就如何解决我的问题向在场的任何人提供建议。

  1. 分解它。把上面的代码拿出来,这实际上不是我的代码,并制作了一个简单得多的RMI服务器版本,并对其进行测试。
  2. 从小到向上,从本地主机开始,确保它工作,然后在单独的PC上进行测试(我有一个虚拟PC),然后在服务器上进行测试。
  3. 寻求帮助!,我在网上搜索了很多。谢谢你,EJP!而且,一旦我终于让它在虚拟PC上工作,而不是在服务器上工作,那么我就让我的it人员参与其中,他们发现两者之间有区别。“在PC上有一个防火墙设置,它与服务器上没有设置的Java相关。”- IT Guy (参见:http://windows.microsoft.com/en-us/windows/communicate-through-windows-firewall#1TC=windows-7 )

我意识到我在这里说的不是什么新鲜事,我知道我听过很多次,但有时需要听上千次才能最终接受。虽然对我的孩子们还没有起作用。;-)

祝好运。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22203552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档