RMI问题,单机运行正常,分布应用时不正常。
Jujus 2004-10-18 04:16:16 客户端代码如下
public static void main(String [] args){
String hostip = args.length > 0 ? args[0] : "localhost";
try{
Registry reg = LocateRegistry.getRegistry(hostip, 3000);
System.out.println("Remote Registry Found:" + reg);
String [] bindedObjs= reg.list();
for(int i = 0; i < bindedObjs.length ; i ++){
System.out.println(bindedObjs[i]);
}
MyService ms = (MyService)reg.lookup("MYSERVICE");
System.out.println("Service Found:" + ms.toString());
int insId = ms.newInstacne(); //问题出在此处,错误信息附后
MyInstance mi = (MyInstance)reg.lookup("Instance" + insId);
System.out.println("Instance Found:" + mi);
System.out.println(mi.sayHello("jujus"));
ms.closeInstance(mi);
}catch(Exception e){
e.printStackTrace();
}
}
错误信息:
[root@JServer classes]# java -classpath . client.RMIClient 192.168.8.111
Remote Registry Found:RegistryImpl_Stub[UnicastRef [liveRef: [endpoint:[192.168. 8.111:3000](remote),objID:[0:0:0, 0]]]]
MYSERVICE
Service Found:MyService_Impl_Stub[UnicastRef [liveRef: [endpoint:[192.168.1.111: 4567](remote),objID:[f72617:ffab03b24f:-8000, 0]]]]
java.rmi.ConnectException: Connection refused to host: 192.168.1.111; nested exc eption is:
java.net.ConnectException: Connection timed out
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574)
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:94)
at rmi.MyService_Impl_Stub.newInstacne(MyService_Impl_Stub.java:52)
at client.RMIClient.main(RMIClient.java:35)
Caused by: java.net.ConnectException: Connection timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:364)
at java.net.Socket.connect(Socket.java:507)
at java.net.Socket.connect(Socket.java:457)
at java.net.Socket.<init>(Socket.java:365)
at java.net.Socket.<init>(Socket.java:178)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirect SocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMaster SocketFactory.java:128)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:569)
... 5 more
问题在于,为什么远程注册表的endpoint是192.168.8.111,而MyService_Impl_Stub的endpoint却是192.168.1.111?
我的环境如下
192.168.8.111是一台路由器,此路由之下有一个子网,其中192.168.1.111被设置为DMZ主机,服务端运行在192.168.1.111上。客户端ip为192.168.8.110