求救!rmi的特殊问题,高分相赠!

bxfeier 2004-07-08 10:48:24
我写的一个简单的rmi在本地测试成功!
大致如下:
try{
//创建远程对象
RmiHelloRemoteObj ttt=new RmiHelloRemoteObj();
//启动注册表
LocateRegistry.createRegistry(2222);
//奖名称绑定到对象
Naming.rebind("//192.168.137.58:2222/helloObj",ttt);

System.out.println("RMI服务器正在运行。。。。。。");
}
catch(Exception e)
{
e.printStackTrace();
}
而放到远程服务器时,远程服务器处在DMZ中
1、用内部ip 即:Naming.rebind("//10.10.10.3:2222/helloObj",ttt);
运行java RmiHelloServer&正常的,但在广域网中的客户端调用时
hotel_rmi.RmiHelloRemoteIntfc c1=(hotel_rmi.RmiHelloRemoteIntfc)Naming.lookup("rmi://218.22.29.243:2222/helloObj");
result=c1.query(show_sql);
报错如下:
java.rmi.ConnectException: Connection refused to host: 10.10.10.3; nested exception is:
java.net.ConnectException: Connection timed out: connect

at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:567)

at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)

at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)

at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:101)

at hotel_rmi.RmiHelloRemoteObj_Stub.query(Unknown Source)

at hotel.BasicMessageBean.showHotel(BasicMessageBean.java:19)
.......

注意此时出错的提示并不是Connection refused to host: 218.22.29.243
(个人认为此时已经Naming.lookup到远程对象。如果我不启动远程rmi才报连不上218.22.29.243)

2、如果我把Naming.rebind("//10.10.10.3:2222/helloObj",ttt);改为Naming.rebind("//218.22.29.243:2222/helloObj",ttt);那么rmi启动不了
报错如下:
java.rmi.ConnectException: Connection refused to host: 218.22.29.243; nested exception is:
java.net.ConnectException: Connection timed out

请问高手们,有没有碰到过此类问题?什么原因,应该怎么解决,下弟在此不胜感激!
...全文
114 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
hainschen 2005-08-19
我想问一下你的注册表程序和你的SERVER是在一台机器上吗
回复
bxfeier 2004-07-09
谢谢 凤梨罐头,按照你的第二个方法
启动的时候-Djava.rmi.server.hostname=218.22.29.243 就连接上了
但java -Djava.rmi.server.hostname=218.22.29.243 hotel_rmi.RmiHelloServer&时,
速度特别慢要好长时间,大概五分钟。而且一会这条进程就断了,不知道什么原因,有哪位大虾遇到此问题吗?怎么解决?
回复
bxfeier 2004-07-08
谢谢 凤梨罐头,不论是不是此原因我要先谢谢。吃过饭马上试一下
回复
liusoft 2004-07-08
另外你需要指定一个参数

启动的时候-Djava.rmi.server.hostname=218.22.29.243
回复
liusoft 2004-07-08
这是我写的一个初始化的方法

private void init(int port, String name)
throws RemoteException,MalformedURLException,IOException
{
if(!bInitRmiEnv){
RMISocketFactory.setSocketFactory(new RMISocketFactory() {
private ServerSocket socket = null;
public Socket createSocket(String host, int _port) throws IOException {
return new Socket(host, _port);
}
public ServerSocket createServerSocket(int _port) throws IOException {
if(_port == 0)
_port = getPort();
if(socket==null)
socket = new ServerSocket(_port);
return socket;
}
});
System.setSecurityManager(new RMISecurityManager() {
public void checkListen(int port) {
if(port!=getPort()&&port!=0)
super.checkListen(port);
}
public void checkConnect(String host,int port) {}
public void checkAccept(String host,int port) {}
});
LocateRegistry.createRegistry(port);
bInitRmiEnv = true;
}
Naming.rebind(getUrl(), this);
}
回复
liusoft 2004-07-08
是不是有防火墙呢?因为RMI通讯并不是只使用你的2222端口,它会开启另外一个端口,除非你重写SocketFactory
回复
ecaol 2004-07-08
UP
回复
相关推荐
发帖
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2004-07-08 10:48
社区公告
暂无公告