关闭

Java RMI:rmi Connection refused to host: 127.0.0.1异常解决

标签: javaRMI异常
9781人阅读 评论(0) 收藏 举报
分类:
又是Linux下RMI异常,不过这次是单网卡的情况,先看异常信息: 
Java代码  收藏代码
  1. [appframe] 2012-10-09 15:20:59,217 - com.opensymphony.xwork2.DefaultActionInvocation -com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:383) -2603911 [http-8282-12] DEBUG  - Executing action method = haveDataContentView  
  2. org.springframework.remoting.RemoteConnectFailureException: Could not connect to remote service [rmi://192.168.2.74:7777/ViewService]; nested exception is java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:   
  3.     java.net.ConnectException: Connection refused  
  4.     at org.springframework.remoting.rmi.RmiClientInterceptorUtils.convertRmiAccessException(RmiClientInterceptorUtils.java:189)  
  5.     at org.springframework.remoting.rmi.RmiClientInterceptor.doInvoke(RmiClientInterceptor.java:347)  
  6.     at org.springframework.remoting.rmi.RmiClientInterceptor.invoke(RmiClientInterceptor.java:259)  
  7.     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
  8.     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)  
  9.     at $Proxy65.viewDictContentHtml(Unknown Source)  
  10.     at com.plat.sap.action.SummaryPropertyDataAction.haveDataContentView(Unknown Source)  


主要信息为:java.rmi.ConnectException: Connection refused to host: 127.0.0.1 

经查,发现Server应用和Client应用都部署在单网卡的Linux上,且Server调Client端的RMI服务没问题,所以料到异常跟系统的域名或IP配置有关。通过Google异常,发现下面这篇文章,谢谢它最终指引我们解决了问题。现收藏如下: 


java.rmi.ConnectException: Connection refused to host: 127.0.0.1异常主要根源是spring实现中,server端使用了主机名,linux在解析主机名时使用了与windows不同的逻辑。 

在使用主机名时有两种说法: 

说法一、 在server端返回的绑定对象中采用的是server主机名(hostname),写一个rmi客户端程序,你可能会收到如标题这样的异常。这个问题其实是由rmi服务器端程序造成的。客户端程序向服务端请求一个对象的时候,返回的stub对象里面包含了服务器的hostname,客户端的后续操作根据这个hostname来连接服务器端。要想知道这个hostname具体是什么值可以在服务器端bash中打入指令: 
    hostname -i 
如果返回的是127.0.0.1,那么你的客户端肯定会抛如标题的异常了。 

解决这个问题有两个方式: 
1) 修改/etc/hosts 
找到127.0.0.1       hostxxxxx这样的字样。把127.0.0.1改成真实的,可供其他机器连接的ip。 
这样客户端就能得到真实的ip了。 
2) 在rmi服务器端程序启动脚本中加上两行,显式指定hostname。我的脚本: 
  
Java代码  收藏代码
  1.  hostname=`hostname`   
  2. java -cp $CLASSPATH -Djava.rmi.server.codebase=$codebase -Djava.security.policy=$PROJECT_HOME/se_server/conf/se_server.policy -  
  3. Djava.rmi.server.hostname=$hostname com.abc.server.StartServer > $PROJECT_HOME/se_server/logs/init.log 2>&1 &  

不过该方式有个局限,其他机器肯定能识别ip,但是可能无法识别hostname。当然,你也可以直接写死这个hostname,比如:-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx。 这样最省力,就是缺乏灵活性。 


说法二、 返回的是根据主机名对应的ip 

Linux系统使用/etc/hosts文件中localhost解析ip为127.0.0.1,当客户端向服务器Lookup时,服务端就会把解析出来的地址发给客户端,让客户端再根据这个地址去连接,客户端收到127.0.0.1这个地址,也使用/etc/hosts文件中localhost解析ip去连接,实际连接的是自己本身,当然也就不行了。 

我把服务器的IP地址加到服务器的/etc/hosts文件中,并放在127.0.0.1之前,以让该服务能先解析到这个IP,从而正确解析出来机器名所对应的IP。 


举例: 
在服务端的 Naming.rebind("SectionWorkerManager", manager );没有指定ip,(这个语句在Windows下没问题)linux系统自己使用localhost解析为IP 127.0.0.1,当客户端向服务器Lookup时,服务端就会把解析出来的地址发给客户端,让客户端再根据这个地址去连接,客户端收到127.0.0.1这个地址去连接,实际连接的是自己本身,当然也就不行了。 

更正办法:把Naming.rebind("SectionWorkerManager", manager); 

改成Naming.rebind("rmi://10.1.5.xxx:1099/SectionWorkerManager", manager);,直接用IP地址(10.1.5.xxx:1099为服务器本身IP),这样就没问题了; 

或者是用机器名,该服务器的名字为RHELTEST,把它加到服务器的hosts文件中,并放在127.0.0.1之前,以让该服务能正确解析出来机器名所对应的IP;要么用域名解析也行,这种方法比较适合大规模场合。 

在Windows下能正常工作,在linux下却不行,这可能是操作系统解析localhost为ip时时的机制不一样引起的。 

在redhat es5中测试,应该使用的是方法2。 

不过两种方式都能解决该问题,采用哪种方式,根据服务器可做的修改来决定。 
spring rmi对此的特别说明: 

Note: RMI makes a best-effort attempt to obtain the fully qualified host name. If one cannot be determined, it will fall back and use the IP address. Depending on your network configuration, in some cases it will resolve the IP to the loopback address. To ensure that RMI will use the host name bound to the correct network interface, you should pass the java.rmi.server.hostname property to the JVM that will export the registry and/or the service using the "-D" JVM argument. For example: -Djava.rmi.server.hostname=myserver.com。 

全文转载完毕。 

以前还整理过一个双网卡下RMI配置的问题,mark一下,有空弄到网上来和大家分享。
2
0
查看评论

调用远程主机上的RMI服务时抛出java.rmi.ConnectException: Connection refused to host: 127.0.0.1异常原因及解决方案

最近使用jmx遇到一个问题,client/server同在一台机器上,jmx client能够成功连接server 如果把server移植到另一台机器上10.1.60.14,抛出如下异常: java.net.ConnectException: Connection
  • yangyan19870319
  • yangyan19870319
  • 2011-08-30 14:37
  • 67577

java.rmi.ConnectException: Connection refused to host: 127.0.0.1解决方案 RMI调用connet refused

在维护一个使用RMI技术的老项目时,发现远程主机调不通,在关闭防火墙,查看端口连接等操作时候发现无效,查看日志发现如下: java.net.ConnectException: Connection refused: connect java.rmi.ConnectException: Conn...
  • u010457406
  • u010457406
  • 2017-02-16 17:50
  • 1560

Jboss客户端连接EJB,javax.naming.CommunicationException [java.rmi.ConnectException: Connection refused to host: 127.0.0.1]异常解决

 在使用远程连接,调用ejb过程中,出现异常javax.naming.CommunicationException [java.rmi.ConnectException: Connection refused to host: 127.0.0.1]。远程服务器为Linux,jboss-4....
  • jionghan3855
  • jionghan3855
  • 2008-05-22 15:16
  • 11900

java.rmi.ConnectException: Connection refused to host: 127.0.0.1

最近用了java的rmi还是不错的,遇到的问题参考网上的文章解决的,做个记录引自 http://hi.baidu.com/wangdefu/blog/item/4e1e041f8d5bdacaa7866987.html 可以参考Sun的资料去理解rmi http://java.sun.co...
  • cnhome
  • cnhome
  • 2009-09-02 17:02
  • 7833

java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: java.net.Con

在使用Zabbix监测Tomcat的运行状态时,发现在Zabbix Server出现java.rmi.ConnectException: Connection refused to host: 127.0.0.1的错误。 网络上有很多是说/etc/hosts的 但是明显是针对于zabbix serv...
  • mingjie1212
  • mingjie1212
  • 2016-12-28 15:34
  • 2781

RMI java.rmi.ConnectException: Connection refused to host: 192.168.1.108

具体请参照http://stackoverflow.com/questions/8485239/java-rmi-connect-exception-connection-refused-to-host-timeout RMI开发时出现这种错误时,可采用如下方式解决: This RMI&...
  • lkl713
  • lkl713
  • 2015-08-25 09:21
  • 2349

到主机 的 TCP/IP 连接失败。 java.net.ConnectException: Connection refused: connect

sqlserver2005默认情况下是禁用了tcp/ip连接。启动tcp/ip连接的方法, 打开 \Microsoft SQL Server 2005\配置工具\目录下的SQL Server Configuration Manager,选择mssqlserver协议, 然后右边窗口有个tcp/i...
  • zzrshuiwuhen
  • zzrshuiwuhen
  • 2013-02-27 10:19
  • 299

关于RMI的几个问题解决

1.多网卡导致的RMI连接问题: Caused by: java.rmi.ConnectException: Connection refused to host: xx.xx.xx.xxx; nested exception is:     &#...
  • fbysss
  • fbysss
  • 2015-06-04 21:06
  • 9243

RMI应用过程中的问题

最近闲来无事补充了下自己的短板,学习了下RMI,本来以为很简单的事,没想到遇到几个问题还是花了一段时间,在这记录下,测试demo代码附在后面。 RMI的原理在这不说了,百度或Google很多,只说下遇到的问题,具体问题解决方法我这说的不清楚也可以Google下。 说明:Centos6是装载VM...
  • yrpting
  • yrpting
  • 2017-01-23 15:47
  • 2571

RMI

RMI = RPC + Serializable RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。RM...
  • luke_wang
  • luke_wang
  • 2015-02-04 19:37
  • 868
    个人资料
    • 访问:336915次
    • 积分:3897
    • 等级:
    • 排名:第9647名
    • 原创:82篇
    • 转载:44篇
    • 译文:0篇
    • 评论:43条
    博客专栏
    最新评论