我有一个使用 Spring 3.0 创建的 RMI 客户端/服务器配置。
当客户端和服务器在同一台机器上运行时:
rmi://localhost:1099/myService
一切都好。当我在另一台机器上运行客户端时(服务器现在在 192.168.1.67 上运行)并且客户端“指向”:
rmi://192.168.1.67:1099/myService
我可以从客户端看到此错误消息:
org.spring...RmiClientInterceptor handlerRemoteConnectFailure.
Could not connect to Rmi Service [rmi://192.1681.67:1099/myService]
服务器是这样配置的:
<bean id="myService" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service" ref="myService"/>
<property name="serviceInterface" value="org.myapp.MyService"/>
<property name="serviceName" value="myService"/>
<property name="alwaysCreateRegistry" value="true"/>
</bean>
<bean id="myService" class="org.myapp.MyServiceImpl" />
和客户:
RmiProxyFactoryBean rpfb = new RmiProxyFactoryBean();
rpfb.setServiceInterface(MyService.class);
rpfb.setLookupStubOnStartup(true);
rpfb.setRefreshStubOnConnectFailure(true);
RMICustomClientSocketFactory socketFactory = new RMICustomClientSocketFactory();
socketFactory.setTimeout(5000);
rpfb.setRegistryClientSocketFactory(socketFactory);
rpfb.setServiceUrl(getRmiUrl(address, port));
rpfb.afterPropertiesSet();
我用嗅探器检查了服务器的 1099 端口,当客户端启动它的进程时,我可以看到一些数据在服务器端“发送”:
JRMI..K
...192.168.1.65..
..192.168.1.65....
P....w"..........................D.M...;.t..myService
Q....w.....e...7B+@5..s}.....5org.springframework.remoting.rmi.RmiInvocationHandlerpxr..java.lang.reflect.Proxy.'. ..C....L..ht.%Ljava/lang/reflect/InvocationHandler;pxpsr.-java.rmi.server.RemoteObjectInvocationHandler...........pxr..java.rmi.server.RemoteObject.a...a3....pxpw2.
UnicastRef..127.0.1.1..../.T~.X.....e...7B+@5...x
R
S
T...e...7B+@5..
我的问题是:为什么如果客户端和服务器在同一台机器上运行,一切都很好,但在不同的机器上我会遇到这个问题?以及如何解决?