最近使用 jmx 遇到一個問題,client/server 同在一臺機器上,jmx client能夠成功連接 server,如果把 server 移植到另一臺機器上192.168.134.128,拋出如下異常: 原因 :這個問題其實是由 rmi 伺服器端程式造成的。 客戶端程式向服務端請求一個對象的 ...
最近使用 jmx 遇到一個問題,client/server 同在一臺機器上,jmx client能夠成功連接 server,如果把 server 移植到另一臺機器上192.168.134.128,拋出如下異常:
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,那麼你的客戶端肯定會拋如標題的異常了。
解決方法有兩種:
- 方法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,則可以添加以下內容
192.168.134.132 test132 localhost
然後修改 /etc/sysconfig/network 文件的 HOSTNAME=test,則可以訪問成功。
[root@test132 /]# vim /etc/sysconfig/network
# Created by anaconda
HOSTNAME=test132
補充:http://scork520.blog.163.com/blog/static/49099202201081324215183/ 這篇文章中講到了 hostname 的配置以及與 hosts 文件的作用,大家看下應該很有幫助。