`

.rmi.ConnectException: Connection refused to host: 127.0.0.1来龙去脉

阅读更多

 

java.rmi.ConnectException: Connection refused to host: 127.0.0.1

 

主要根源是spring实现中,server端使用了主机名,linux在解析主机名时使用了与windows不同的逻辑。

 

在使用主机名时有两种说法

说法一:在server端返回的绑定对象中采用的是server主机名,

写一个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

inux系统使用/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

 

 

分享到:
评论
1 楼 di1984HIT 2013-11-22  
不错。学习了啊

相关推荐

    启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法

     错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099; nested exception is: java.net.BindException: Address already in use: JVM_Bind  这里说的是1099端口被其它进程占用...

    net.genady.rmi_2.0.7_Eclipse33

    1. **远程接口(Remote Interface)**:这是定义远程方法的接口,需要继承java.rmi.Remote接口,并声明抛出java.rmi.RemoteException的异常。 2. **远程对象(Remote Object)**:实现了远程接口的类,这个类的对象...

    JMeter分布式原理,远程启动配置,jmeter在Linux上分布式压测环境搭建配置,命令行运行+问题集合,修改jvm值

    5 Server failed to start: java.rmi.RemoteException: Cannot start. localhost.localdomain is a loopback address.An error occurred: Cannot start. localhost.localdomain is a loopback address.

    JAVA rmi教学课件

    6. `java.rmi`和`java.rmi.CORBA`:RMI-IIOP相关API,RMI-IIOP是RMI的一种扩展,它使用CORBA协议进行通信,常用于EJB环境。 定位远程对象的过程通常涉及使用RMI命名服务,如通过JNDI(Java Naming and Directory ...

    RMI.rar_Java RMI_java.rmi_java.rmi.Remot_remote

    远程接口定义了可以在远程对象上执行的操作,它继承了`java.rmi.Remote`接口。这个接口不包含任何方法,但它是所有远程接口的基类,用来标记这些接口为远程可调用。远程对象是实现了远程接口的具体类,它实现了接口...

    JAVA RMI入门教程

    3. `java.rmi.dgc`: 分布式垃圾收集(DGC)的API,帮助管理远程对象的生命周期。 4. `java.rmi.registry`: 提供RMI的网络命名服务,类似于服务发现机制。 5. `java.rmi.server`: 服务器端操作的API,包括服务器端的回...

    rmi接口技术详细介绍文档

    3. `java.rmi.dgc`: 分布式垃圾收集器(DGC)的API,用于管理远程对象的生命周期。 4. `java.rmi.registry`: RMI网络命名服务的API,用于查找和注册远程对象。 5. `java.rmi.server`: 服务器端操作的API,包含服务器端...

    java 远程方法调用(java rmi)

    这些方法必须声明为`remote`,并且可能会抛出`java.rmi.RemoteException`。 2. 远程实现(Remote Implementation):实现了远程接口的具体类,它提供了远程方法的实际实现。 3. 注册表(Registry):RMI系统中的一个...

    基于java的远程调用.zip

    1. **接口定义**:首先,你需要定义一个远程接口(Remote Interface),它继承自Java的`java.rmi.Remote`接口,并声明所有远程方法。这些方法将抛出`java.rmi.RemoteException`。 2. **实现远程接口**:然后,创建...

    java RMI技术讲解

    - **`java.rmi.server.UnicastRemoteObject`**:实现了`java.rmi.server.RemoteObject`,用于创建远程对象的桩和框架。 - **`java.lang.Object`**:所有Java对象的基类。 - **`java.rmi.registry.LocateRegistry`**...

    java-RMI技术讲解

    - 客户端使用`org.springframework.remoting.rmi.RmiProxyFactoryBean`实现远程服务的代理功能。 - 客户端还需要定义与服务器端服务接口相同的类,以便进行调用。 #### 3. RMI的局限性 RMI当前使用Java远程消息...

    jmeter在linux上运行报错问题解决.txt

    在linux上启动jmeter-server报错: ...Server failed to start: java.rmi.RemoteException: Cannot start. localhost is a loopback address. An error occurred: Cannot start. localhost is a loopback address.

    严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Error-附件资源

    严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Error-附件资源

    rmi回调实例含代码

    RMI(Remote Method Invocation,远程方法调用)是Java中的一种技术,允许一个Java对象调用在不同JVM上的另一个Java对象的方法。这种技术在分布式系统中尤其有用,它可以简化跨网络的应用程序通信。在本实例中,我们...

    java_rmi.rar_RMI java_java.rmi

    2. **实现远程接口**:然后,创建一个实现远程接口的类,该类通常需要继承自`java.rmi.Remote`接口,并且抛出`java.rmi.RemoteException`。在这个实现类中,你需要实现远程接口中的所有方法。 3. **创建并注册远程...

    JMX以RMI方式连接的场景示例

    JMX以RMI方式连接的场景示例 JMX(Java Management Extensions)是一种Java技术,用于管理和监控应用程序。JMX框架主要由三部分组成:MBean(Managed Bean)、Agent(代理)和Client(客户端)。在本场景中,我们将...

    java API文档

    - **java.rmi.activation**:支持激活ID管理等远程服务功能。 - **java.rmi.dgc**:提供了与RMI相关的数据管理功能。 - **java.rmi.registry**:注册表服务支持。 - **java.rmi.server**:服务器端RMI支持。 - ...

Global site tag (gtag.js) - Google Analytics