我意识到这个问题已被多次询问并且多次回答(通常来自EJP,他清楚地知道他的东西!),但我仍在努力。
我“窃取”了一个简单的RMI添加服务器和客户端。 (谢谢, http://www.scs.ryerson.ca/mes/courses/cps530/programs/rmi/Schildt/addTwoNumbers.html然后将其归功于P.Naughton和H.Schildt的“Java 2:完整参考”第24章。)
无论我尝试什么,我仍然会得到这个“连接超时”例外。 谁能看到我做错了什么?
我怀疑防火墙正在发生一些事情,但如果是这样,我不知道该告诉我的IT人员如何解决和改变。
提前致谢!
接口:
public interface AddServerIntf extends Remote {
double add(double d1, double d2) throws RemoteException;
}
服务器:
public class SimpleRMIExServer {
public static void main(String[] args) throws Exception {
System.out.println("Class name " + SimpleRMIExServer.class.getSimpleName());
System.out.println("Path " + System.getProperty("user.dir"));
System.setProperty("java.rmi.server.codebase",
"file:///D:\\SimpleRMIExample\\lib\\SimpleRMIExample.jar");
Registry registry;
try {
registry = LocateRegistry.createRegistry(1099);
} catch (RemoteException remoteException) {
registry = LocateRegistry.getRegistry(1099);
}
AddServerImpl addServerImpl = new AddServerImpl();
registry.bind("AddServer", addServerImpl);
System.out.println("Located Registry " + registry.toString());
for (String boundName : registry.list()) {
System.out.println("Name bound: " + boundName);
}
Naming.rebind("SERVERNAME", addServerImpl);
System.out.println("Registry: " + registry);
System.out.println("");
System.out.println("Remote: " + addServerImpl);
}
}
public class AddServerImpl extends UnicastRemoteObject implements AddServerIntf {
public AddServerImpl() throws RemoteException {
}
@Override
public double add(double d1, double d2) throws RemoteException {
return d1 + d2;
}
}
客户端:
public class SimpleRMIExClient {
public static void main(String[] args) throws Exception {
final Registry registry = LocateRegistry.getRegistry("SERVERNAME", 1099);
AddServerIntf addServerIntf = (AddServerIntf) registry.lookup("AddServer");
System.out.println("The first number is: " + 10);
double d1 = Double.valueOf(10).doubleValue();
System.out.println("The second number is: " + 15);
double d2 = Double.valueOf(15).doubleValue();
System.out.println("The sum is: " + addServerIntf.add(d1, d2)); //Exception occurs here.
}
}
从服务器输出:
D:\>java -jar SimpleRMIExServer.jar
Class name SimpleRMIExServer
Path D:\
Located Registry RegistryImpl[UnicastServerRef [liveRef: [endpoint:[XX.XX.XX.XX:
1099](local),objID:[0:0:0, 0]]]]
Name bound: AddServer
Registry: RegistryImpl[UnicastServerRef [liveRef: [endpoint:[XX.XX.XX.XX:1099](l
ocal),objID:[0:0:0, 0]]]]
Remote: AddServerImpl[UnicastServerRef [liveRef: [endpoint:[XX.XX.XX.XX:54119](l
ocal),objID:[2a7202aa:14492e5ea89:-7fff, -5034491972061237368]]]]
客户输出:
debug:
The first number is: 10
The second number is: 15
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: XX.XX.XX.XX; nested exception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
at com.sun.proxy.$Proxy0.add(Unknown Source)
at com.sun.proxy.$Proxy0.add(Unknown Source)
at simplermiexclient.SimpleRMIExClient.main(SimpleRMIExClient.java:35)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 7 more
Java Result: 1
BUILD SUCCESSFUL (total time: 1 minute 33 seconds)
此外,我使用命令netstat -a并显示:
LocalAddress ForeignAddress State
0.0.0.0:1099 SERVERNAME:0 LISTENING
[::]:1099 SERVERNAME:0 LISTENING
XX.XX.XX.XX:53373 SERVERNAME:1099 ESTABLISHED
(在许多其他行中) 我也看到了:
LocalAddress ForeignAddress State
XX.XX.XX.XX:54138 SERVERNAME:1099 TIME_WAIT
修改 我尝试加入:
System.setProperty("java.rmi.server.hostname", "SERVERNAME");
在设置codebase系统属性后立即向服务器发送,基于EJP建议其他许多人阅读Java RMI FAQ A.1。
当我这样做时,这就是堆栈跟踪:
debug:
The first number is: 10
The second number is: 15
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: SERVERNAME; nested exception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
at com.sun.proxy.$Proxy0.add(Unknown Source)
at com.sun.proxy.$Proxy0.add(Unknown Source)
at simplermiexclient.SimpleRMIExClient.main(SimpleRMIExClient.java:35)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 7 more
Java Result: 1
BUILD SUCCESSFUL (total time: 1 minute 15 seconds)
回答我自己的问题: 我找到了问题的答案。我喜欢看到其他人这样做,能够自己说出来是件好事。
我的最终解决方案是防火墙问题,但我想向那里的任何人提供建议,以解决我的问题。
将其分解。将我的代码放在上面,这真的不是我的代码,并制作一个更简单的RMI服务器版本并对其进行测试。
从小处着手继续前进。从localhost开始确保可行,然后在单独的PC上测试(我有一台虚拟PC),然后在您的服务器上进行测试。 / p>
获得帮助!我在互联网上搜索了很多。谢谢你,EJP!此外,一旦我终于让它在虚拟PC上工作,而不是在服务器上工作,那么我就让我的IT人员参与进来,他们发现两者之间存在差异。 “PC上有一个与Java相关的防火墙设置,但没有在服务器上设置。” - IT Guy(见:http://windows.microsoft.com/en-us/windows/communicate-through-windows-firewall#1TC=windows-7)
我意识到我在这里所说的并不是什么新鲜事,我知道我已多次听过它,但有时需要听到它一千次才能最终接受。虽然它还没有和我的孩子一起工作。 ; - )
祝你好运。
答案 0 :(得分:2)
(通过问题编辑回答。转换为社区维基回答。请参阅Question with no answers, but issue solved in the comments (or extended in chat))
OP写道:回答我自己的问题:我已经找到了问题的答案。我喜欢看到其他人这样做,能够自己说出来是件好事。
我的最终解决方案是防火墙问题,但我想向那里的任何人提供建议,以解决我的问题。
将其分解。将我的代码放在上面,这真的不是我的代码和制作 一个更简单的RMI服务器版本并对其进行测试。
从小处着手继续前进。从localhost开始确认 这是有效的,然后在另一台PC上测试(我有一台虚拟PC) 在您的服务器上测试。
- 醇>
获得帮助!我在互联网上搜索了很多。谢谢你,EJP!还有,一次 我终于让它在虚拟PC上工作,但不在服务器上, 然后我去了我的IT人员参与,他们找到了区别 他们俩。 “PC上有一个与之相关的防火墙设置 未在服务器上设置的Java。“ - IT Guy(参见: http://windows.microsoft.com/en-us/windows/communicate-through-windows-firewall#1TC=windows-7 )
我意识到我在这里所说的并不是什么新鲜事,我知道我已多次听过它,但有时需要听到它一千次才能最终接受。虽然它还没有和我的孩子一起工作。 ; - )
祝你好运。