写一个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。 这样最省力,就是少点灵活性.
网上的基本都是上面的方案,1写的不太清楚。
3. /etc/hosts修改:
假如你的机器是nlpserver,IP是10.200.7.100 在/etc/hosts中添加这两条
127.0.0.1 localhost.localdomain localhost
10.200.7.100 nlpserver
,这样执行 #hostname -i 会直接显示你要绑定的IP 10.200.7.100。
这样你的RMI服务没有问题,其它应用访问localhost也没有问题。
分享到:
相关推荐
错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099; nested exception is: java.net.BindException: Address already in use: JVM_Bind 这里说的是1099端口被其它进程占用...
2. **实现远程接口**:创建接口的实现类,并在该类中抛出`java.rmi.RemoteException`。 3. **注册远程对象**:通过`java.rmi.registry.Registry`将远程对象注册到RMI服务器上,以便客户端可以找到。 4. **客户端调用...
这些方法通常抛出`java.rmi.RemoteException`,因为网络通信中可能出现的各种问题。 2. **实现远程对象**:创建一个实现远程接口的类,实现接口中声明的方法。这些方法将被序列化并通过网络传输。 3. **注册远程...
这些方法必须声明为`remote`,并且可能会抛出`java.rmi.RemoteException`。 2. 远程实现(Remote Implementation):实现了远程接口的具体类,它提供了远程方法的实际实现。 3. 注册表(Registry):RMI系统中的一个...
4. **客户端调用**: 客户端通过`java.rmi.Naming`查找远程服务,并进行远程调用。 #### 三、RMI远程调用示例分析 ##### 1. 接口定义 ```java import java.rmi.Remote; import java.rmi.RemoteException; public ...
这是因为RMI会将远程抛出的异常封装为java.rmi.RemoteException,并在客户端重新抛出。 8. 安全性:RMI提供了安全机制,可以通过设置权限控制来限制对远程对象的访问。默认情况下,RMI使用Java的安全模型,允许管理...
2. **实现远程接口**:然后,创建一个实现远程接口的类,该类通常需要继承自`java.rmi.Remote`接口,并且抛出`java.rmi.RemoteException`。在这个实现类中,你需要实现远程接口中的所有方法。 3. **创建并注册远程...
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.
远程接口中的方法声明会抛出`RemoteException`,表明这些方法是可以被远程调用的。 2. **远程对象(Remote Object)**:实现了远程接口的类,通常需要继承`java.rmi.UnicastRemoteObject`。这个类负责具体实现远程...
- **java.rmi.activation**:支持激活ID管理等远程服务功能。 - **java.rmi.dgc**:提供了与RMI相关的数据管理功能。 - **java.rmi.registry**:注册表服务支持。 - **java.rmi.server**:服务器端RMI支持。 - ...
这些方法将抛出`java.rmi.RemoteException`。 2. **实现远程接口**:然后,创建一个实现了远程接口的类,这个类是实际的远程对象。在实现类中,你需要提供远程方法的具体实现。 3. **注册远程对象**:在服务器端,...
31. **java.rmi.activation**:RMI对象激活支持,允许对象在需要时自动创建。 32. **java.rmi.dgc**:RMI分布式的垃圾回收支持。 33. **java.rmi.registry**:RMI注册表,用于查找和管理远程对象。 34. **java....
JMX以RMI方式连接的场景示例 JMX(Java Management Extensions)是一种Java技术,用于管理和监控应用程序。JMX框架主要由三部分组成:MBean(Managed Bean)、Agent(代理)和Client(客户端)。在本场景中,我们将...
这个接口必须继承自`java.rmi.Remote`,并且声明的所有方法都必须抛出`java.rmi.RemoteException`。 2. **远程实现(Remote Implementation)**:实现了远程接口的类,它实际上包含了远程方法的实现。这个类需要被...
6. **部署和运行**:使用RMI时,需要将远程对象导出(`java.rmi.Naming.rebind()`),然后客户端可以通过`java.rmi.Naming.lookup()`查找并调用远程对象。在实际应用中,还需要配置JVM的RMI端口和其他网络参数。 在...
1. 远程接口(Remote Interface):定义了可以被远程调用的方法,这些方法必须声明抛出`java.rmi.RemoteException`。接口需要使用`@Remote`注解标记。 2. 远程实现类(Remote Implementation):实现了远程接口,并...
接口中的方法声明抛出java.rmi.RemoteException,这是所有RMI特定异常的超类。 2. **远程实现(Remote Implementation)**:实现了远程接口的具体类,包含了远程方法的实现。这个类需要被Java的序列化机制支持,...
Java 远程方法调用(Remote Method Invocation,RMI)是一种在分布式环境中调用对象方法的技术,它使得Java应用程序能够透明地调用运行在不同 JVM 上的远程对象的方法。RMI 包含了一系列的参数,这些参数对于优化...
1. 定义远程接口:接口需继承`java.rmi.Remote`,并声明可能抛出`java.rmi.RemoteException`的方法。 2. 实现远程接口:在服务器端实现接口,并通过`java.rmi.server.UnicastRemoteObject`导出远程对象。 3. 注册...