在维护一个使用RMI技术的老项目时,发现远程主机调不通,在关闭防火墙,查看端口连接等操作时候发现无效,查看日志发现如下:
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)
发现关键词在127.0.0.1上,明明调用的地址不是127.0.0.1,怎么会有这个问题呢,经过查资料发现:
客户端程序向服务端请求一个对象的时候,返回的stub对象里面包含了服务器的hostname,客户端的后续操作根据这个hostname来连接服务器端。要想知道这个hostname具体是什么值可以在服务器端bash中打入指令:hostname -i 如果返回的是127.0.0.1,那么你的客户端肯定会抛如标题的异常了。
解决方案:
修改host文件:
vi /etc/hosts
真实地址 主机名
重启应用
收工!