ubuntu 运行 java rmi_[实战记录]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注册端口和已经固定的数据端口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值