最近使用 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