java的jmr有两种注册发,1 代码注册 2 另起进程
第2种方式太麻烦,本文仅讨论第一种方式的最佳实践
http://blog.51cto.com/6221123/1112619
按此链接构建demo ,
server
UserManagerImpl userManager=new UserManagerImpl(); UserManagerInterface userManagerI=(UserManagerInterface) UnicastRemoteObject.exportObject(userManager,0); // Bind the remote object's stub in the registry Registry registry = LocateRegistry.createRegistry(2001); registry.rebind("userManager", userManagerI); // 启动时指定-Djava.rmi.server.hostname=192.168.57.234,否则客户端运行期报异常, // 无法获取-Dcom.sun.management.jmxremote.port // registry = LocateRegistry.getRegistry(8288); System.out.println("server is ready");
client
Registry registry = LocateRegistry.getRegistry("192.168.57.234",2001); UserManagerInterface userManager = (UserManagerInterface)registry.lookup("userManager"); User user = userManager.getUser(); System.out.println(user.getName() + ":" + user.getAge());
报:
Java RMI:rmi Connection refused to host: 127.0.0.1
参考:https://blog.csdn.net/chenchaofuck1/article/details/51558995/
提出3个解决方案——
1) 修改/etc/hosts
找到127.0.0.1 hostxxxxx这样的字样。把127.0.0.1改成真实的,可供其他机器连接的ip,如 192.168.xx.xx hostname
这样客户端就能得到真实的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。 这样最省力,就是缺乏灵活性。
赞成
3)代码解决
更正办法:把Naming.rebind("SectionWorkerManager", manager);
改成Naming.rebind("rmi://10.1.5.xxx:1099/SectionWorkerManager", manager);,直接用IP地址(10.1.5.xxx:1099为服务器本身IP),这样就没问题了;
改成Naming.rebind("rmi://10.1.5.xxx:1099/SectionWorkerManager", manager);,直接用IP地址(10.1.5.xxx:1099为服务器本身IP),这样就没问题了;
这种方式没成功
更详细的内容有:https://blog.csdn.net/lmy86263/article/details/725947609
最主要的:启动命令行java -Djava.rmi.server.hostname=192.168.57.234 -jar rmi.jar