java.net.ConnectException: 连接超时:连接失败?

13

我在我的代码中使用了RMI:

 import java.rmi.*;

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

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

public class AddServerImpl extends UnicastRemoteObject implements AddServerIntf {
  public AddServerImpl() throws RemoteException {
  }

 public double add(double d1,double d2) throws RemoteException {
  return d1+d2;
 }
}  

import java.net.*;
import java.rmi.*;

public class AddServer {
   public static void main(String args[]) {
    try {
     AddServerImpl addServerImpl=new AddServerImpl();
     Naming.rebind("AddServer",addServerImpl);
    }  catch(Exception exc) {
          System.out.println(exc);
       }
   }
}

import java.rmi.*;
public class AddClient {
  public static void main(String args[]) {
     try {
       String Url="rmi://"+args[0]+"/AddServer";
       AddServerIntf addServerIntf=(AddServerIntf)Naming.lookup(Url);
       System.out.println("The first number is "+args[1]);
       double d1=Double.valueOf(args[1]).doubleValue();
       System.out.println("The second number is: "+args[2]);
       double d2=Double.valueOf(args[2]).doubleValue();
       System.out.println("The Sum is: "+addServerIntf.add(d1,d2));
     }  catch(Exception exc) {
         System.out.println(exc);
       }
   }
 }

这里有4个Java文件。

接下来我编译了这些文件,然后使用rmic AddServerImpl创建了一个stub。之后在服务器端使用start rmiregistry启动RMI注册表。然后使用java AddServer启动服务器,最后使用java AddClient 27.60.200.80 5 9启动客户端。但是什么都没有发生

在客户端上抛出的异常是java.net.ConnectException: connection timed out: connect

原因是什么?如何解决?

在客户端机器上,以下是AddClient.class AddServerImpl.class AddServerImpl_Stub.class,而在服务器端上是AddServer.class AddServerImpl.class AddServerImpl_Stub.class AddServerIntf.class


如果有异常,请发布堆栈跟踪。 - Hardik Mishra
最简单的解释:您的服务器IP地址不是您想象的那个。 - Anon
通常的原因可以在RMI FAQ中的A.1项中解决。 - user207421
4个回答

46

错误信息已经说明了问题:您的连接超时了。这意味着您的请求在一定时间内(默认时间)没有得到响应。导致未收到响应的原因可能是以下之一:

  • a) IP/域名或端口不正确
  • b) IP/域名或端口(即服务)已关闭
  • c) IP/域名响应时间超过了您的默认超时时间
  • d) 您的防火墙正在阻止使用任何端口的请求或响应
  • e) 您的防火墙正在阻止对特定主机的请求
  • f) 您的互联网访问不可用

请注意,防火墙和端口或IP阻止可能由您的ISP设立。


@ Richard,我不看到任何理由。 - saplingPro
3
即使你看不到原因,你也应该调查和测试它们,因为这些是连接超时的最有可能原因。你还应该听取其他人的建议,并使用完整的堆栈跟踪编辑你的帖子。 - Anon
1
两者都不正确。两种方式都会产生“连接被拒绝”的错误。 - user207421
1
对于Java,请使用host =“localhost”。 - Shihab Uddin
1
@shihab_returns 如何使用?在哪里?为什么?你在说什么? - user207421
你居住在美国政府制裁的国家。 - Emad Razavi

1

编号(1):IP地址不正确-这是正确的答案。/etc/hosts文件(又名C:\Windows\system32\drivers\etc\hosts)中有一个本地机器名称的错误条目。已更正“hosts”文件,Camel运行得非常好。感谢您的指引。


我花了好几天的时间才找到这个答案,解决了我在使用ehcache多播时遇到的问题...原来是ISP在机器的/etc/hosts文件中设置了错误的IP。真是太有见地了! - Matt King
在我的情况下,问题是我在IPv4中拥有与我尝试连接的主机相同的IP。网络自动分配给我完全相同的IP。 - Jennifer Miranda Beuses

0

异常:java.net.ConnectException

这意味着您的请求在规定的时间内没有从服务器获得响应。造成此异常的原因有:

  • 过多的请求导致服务器超载
  • 由于错误的网络配置或线路超载而导致请求数据包丢失
  • 有时防火墙会在服务器接收请求之前消耗请求数据包
  • 还取决于线程连接池配置和连接池的当前状态
  • 在传输过程中丢失响应数据包

-2
如果您将配置指向域名(例如fabrikam.com),请进行NSLOOKUP以确保所有响应的IP地址都是有效的,并且可以在端口389上连接:
NSLOOKUP fabrikam.com

Test-NetConnection <IP returned from NSLOOKUP> -port 389

为什么?端口389是LDAP。这是Java RMI。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接