独悲十八爷吧 关注:10贴子:469
  • 0回复贴,共1

[实战记录]ubuntu14下实现RMI

只看楼主收藏回复

一,自己在本机(ubuntu14)下测试客户端与提供服务端的代码通过(注:也就是在单网卡测试通过)
二,自己也开了win7虚拟机,放服务端. 物理机ubuntu客户端测试也通过.
三,在把服务端放在实际生产环境ubuntu服务器开启时,遇到一系列问题,经过折腾完美解决~
过程记录:
当我把服务端放到服务器运行时,开启我电脑客户端,报错,经过排查得知,在linux系统环境下,RMI服务端返回的hostname是"localhost",客户端解析"localhost"时,得到的不是我服务器的公网IP地址,而是本地回环地址"127.0.0.1",所以报错(windowns服务器则会解析hostname为公网IP地址,所以放置服务端在windowns下的,不存在此问题).
在经过一系列学习知道,上面这种错误,我知道的可以有两种解决方案(注:是在ubuntu环境下,因为ubuntu不存在/etc/sysconfig/network文件,所以不写第三种,不过以下两种是通用的,不分linux发行版本):(一)在java启动jar包时加入参数,即"java -Djava.rmi.server.hostname=你的IP -jar 你的jar包名称.jar"启动即可.(此方法可启动的前提是,你要开放你的注册端口+数据端口,RMI注册端口是自己设置的,而数据端口默认随机,所以你需要关闭防火墙才能启动).
(二)在java代码中实现hostname参数编写以及数据端口固定.
a.在你的service主类加入System.setProperty("java.rmi.server.hostname", "47.106.128.147");//47.106.128.147是我的服务器公网IP地址,你们要替换为你们的服务器IP地址.
b.在其他代码不变的情况下, 编写固定数据端口代码:
package com.linuxbc.port;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.rmi.server.RMISocketFactory;/* * 数据端口固定 * */public class CustomSocket extends RMISocketFactory {public static void main(String[] args) {}public ServerSocket createServerSocket(int port) throws IOException {if (port == 0) {port = 6601;//这是数据端口,可以设置为别的端口}return new ServerSocket(port);}public Socket createSocket(String host, int port) throws IOException { System.out.println("host:"+host+" port:"+port); return new Socket(host,port);}}
然后在service主类中实现:
try { CustomSocket cs=new CustomSocket();//固定数据端口 try { RMISocketFactory.setSocketFactory(cs); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
我这边的完整的service主类为:
package com.linuxbc.person;import java.io.IOException;import java.rmi.Naming;import java.rmi.registry.LocateRegistry;import java.rmi.server.RMISocketFactory;import com.linuxbc.port.CustomSocket;import com.linuxbc.service.*;import com.linuxbc.serviceImpl.*;public class Service {public static void main(String[] args) {System.setProperty("java.rmi.server.hostname", "47.106.128.147");try { CustomSocket cs=new CustomSocket();//固定数据端口 try { RMISocketFactory.setSocketFactory(cs); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }PersonService personService=new PersonServiceImpl();//注册通讯端口LocateRegistry.createRegistry(6600);//注册通讯路径Naming.rebind("rmi://localhost:6600/PersonService", personService);System.out.println("服务已经启动!");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
最后不要忘了在防火墙开启你的RMI注册端口和已经固定的数据端口


IP属地:北京1楼2018-10-01 13:01回复