`
nesuk
  • 浏览: 167742 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

rmi.ConnectException: Connection refused to host: 127.0.0.1前因后果

阅读更多
又是Linux下RMI异常,不过这次是单网卡的情况,先看异常信息:
[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
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: 
	java.net.ConnectException: Connection refused
	at org.springframework.remoting.rmi.RmiClientInterceptorUtils.convertRmiAccessException(RmiClientInterceptorUtils.java:189)
	at org.springframework.remoting.rmi.RmiClientInterceptor.doInvoke(RmiClientInterceptor.java:347)
	at org.springframework.remoting.rmi.RmiClientInterceptor.invoke(RmiClientInterceptor.java:259)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy65.viewDictContentHtml(Unknown Source)
	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。我的脚本:
  
 hostname=`hostname` 
java -cp $CLASSPATH -Djava.rmi.server.codebase=$codebase -Djava.security.policy=$PROJECT_HOME/se_server/conf/se_server.policy -
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一下,有空弄到网上来和大家分享。
分享到:
评论
1 楼 di1984HIT 2015-09-13  
学习了,写的不错。。。

相关推荐

    Rain Water Algorithm雨水优化算法附matlab代码.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于springboot+vue的房屋租赁出售系统

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    杭电-[数据结构(c语言版)]复习题纲杭州电子科技大学.pdf

    杭州电子科技大学,期末考试资料,计算机专业期末考试试卷,试卷及答案,数据结构。

    年医院医生个人工作总结.docx

    工作总结,新年计划,岗位总结,工作汇报,个人总结,述职报告,范文下载,新年总结,新建计划。

    阿里巴巴笔试题目.docx

    校园招聘笔试题目及答案

    顺从宗族联动机器人matlab代码.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于Python的图像阴影检测与去除源码(高分期末大作业项目).zip

    基于Python的图像阴影检测与去除源码(高分期末大作业项目).zip已获导师指导并通过的97分的高分期末大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 基于Python的图像阴影检测与去除源码(高分期末大作业项目).zip已获导师指导并通过的97分的高分期末大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 基于Python的图像阴影检测与去除源码(高分期末大作业项目).zip已获导师指导并通过的97分的高分期末大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 基于Python的图像阴影检测与去除源码(高分期末大作业项目).zip已获导师指导并通过的97分的高分期末大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 基于Python的图像阴影检测与去除源码(高分期末大作业项目).zip已获导师指导并通过的97分的高分期末大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。基于Python的图像阴影检

    Android阅读器源码

    Android阅读器源码是用于在Android平台上开发电子书阅读器应用的源代码。阅读器可以支持多种电子书格式,如EPUB、PDF、TXT等,并提供诸如翻页、搜索、书签、夜间模式等功能。

    该项目包含为与用户合作的微电网能源管理系统的多目标优化而开发的matlab代码.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    人力资源数据分析看版.xlsx

    Excel数据看板,Excel办公模板,Excel模板下载,Excel数据统计,数据展示

    MS15-058 SQL Server 2008 R2 Service Pack 3 补丁包

    MS15-058 SQL Server 2008 R2 Service Pack 3 SQLServer2008R2-KB3045314-x64 不太好找,找到了,就分享一下吧

    基于LabView+MATLAB的说话人识别系统.zip

    labview 与 C 和BASIC 一样,LabVIEW [2]也是通用的编程系统,有一个完成任何编程任务的庞大函数库。LabVIEW [3]的函数库包括数据采集、GPIB、串口控制、数据分析、数据显示及数据存储,等等。LabVIEW [3]也有传统的程序调试工具,如设置断点、以动画方式显示数据及其子程序(子VI)的结果、单步执行等等,便于程序的调试。 LabVIEW [2](Laboratory Virtual Instrument Engineering Workbench)是一种用图标代替文本行创建应用程序的图形化编程语言。传统文本编程语言根据语句和指令的先后顺序决定程序执行顺序,而 LabVIEW 则采用数据流编程方式,程序框图中节点之间的数据流向决定了VI及函数的执行顺序。VI指虚拟仪器,是 LabVIEW 的程序模块。 LabVIEW [2] 提供很多外观与传统仪器(如示波器、万用表)类似的控件,可用来方便地创建用户界面。用户界面在 LabVIEW 中被称为前面板。使用图标和连线,可以通过编程对前面板上的对象进行控制。这就是图形化源代码,又称G代码。

    JavaSE技术题Java开发过程中的面试

    JavaSE技术题Java开发过程中的面试

    Python实现基于深度学习的预测区域电力负荷模型源码+项目说明(高分项目).zip

    Python实现基于深度学习的预测区域电力负荷模型源码+项目说明.zip已获导师指导并通过的97分的高分期末大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 Python实现基于深度学习的预测区域电力负荷模型源码+项目说明.zip已获导师指导并通过的97分的高分期末大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 Python实现基于深度学习的预测区域电力负荷模型源码+项目说明.zip已获导师指导并通过的97分的高分期末大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 Python实现基于深度学习的预测区域电力负荷模型源码+项目说明.zip已获导师指导并通过的97分的高分期末大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 Python实现基于深度学习的预测区域电力负荷模型源码+项目说明.zip已获导师指导并通过的97分的高分期末大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 Python实现基于

    会创意年会策划.docx

    年会班会资料,节目策划,游戏策划,策划案,策划方案,活动方案,筹办,公司年会,开场白,主持人,策划主题,主持词,小游戏。

    基于物联网MQTT协议的智能停车场管理系统

    基于物联网MQTT协议的智能停车场管理系统 本项目为Eclipse搭建的Maven Web项目 前端采用BootStrap框架 后端采用SSM框架 主要特点: 1.管理员与用户两大功能组 2.基于Apache Apollo服务器的MQTT通信,用于实现地锁装置与管理系统的通信 3.采用第三方微信支付BufPay

    com.baidu.netdisk_12.9.6.apk

    com.baidu.netdisk_12.9.6.apk

    合并两个有序链表是一个常见的编程问题.txt

    两个有序链表的合并pta

    ASP.NET Core 运行时 6.0.29

    ASP.NET Core 运行时 6.0.29

    计算机科学与技术专业数据结构试题 2002年7月杭州电子科技大学期末考试题.pdf

    杭州电子科技大学,期末考试资料,计算机专业期末考试试卷,试卷及答案,数据结构。

Global site tag (gtag.js) - Google Analytics