調用遠程主機上的 RMI 服務時拋出 java.rmi.ConnectException: Connection refused to host: 127.0.0.1 異常緣由及解決方案

最近使用 jmx 遇到一個問題,client/server 同在一臺機器上,jmx client可以成功鏈接 server,若是把 server 移植到另外一臺機器上192.168.134.128,拋出以下異常:java

java.net.ConnectException: Connection refused: connect  
java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:   
    java.net.ConnectException: Connection refused: connect  
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)  
    at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)  
    at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)  
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)  
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)  
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)  
    at $Proxy0.getAllSections(Unknown Source)  
    at ccg.boccrawler.rmi.TestClient.main(TestClient.java:21)

緣由:這個問題實際上是由 rmi 服務器端程序形成的。 客戶端程序向服務端請求一個對象的時候,返回的 stub 對象裏面包含了服務器的 hostname,客戶端的後續操做根據這個 hostname 來鏈接服務器端。要想知道這個hostname 具體是什麼值能夠在服務器端 bash 中打入指令:hostname -i 若是返回的是127.0.0.1,那麼你的客戶端確定會拋如標題的異常了。vim

解決方法有兩種bash

  • 方法1:/etc/hosts 裏的 127.0.0.1 修改成實際的 IP 地址(這種方法可能會致使有些應用不能用,不推薦)
  • 方法2:先在 /etc/hosts 裏添加一行,而後修改 /etc/sysconfig/network 文件裏面的 HOSTNAME

如你的 hosts 文件原來內容服務器

[root@test132 /]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

機器的實際 IP 爲192.168.134.132,則能夠添加如下內容dom

192.168.134.132 test132 localhost

而後修改 /etc/sysconfig/network 文件的 HOSTNAME=test,則能夠訪問成功。tcp

[root@test132 /]# vim /etc/sysconfig/network

# Created by anaconda
HOSTNAME=test132

補充:http://scork520.blog.163.com/blog/static/49099202201081324215183/ 這篇文章中講到了 hostname 的配置以及與 hosts 文件的做用,你們看下應該頗有幫助。.net

相關文章
相關標籤/搜索