使用隧道的JavaRMI-一个例外

使用隧道的JavaRMI-一个例外,java,ssh,rmi,putty,Java,Ssh,Rmi,Putty,当我们完成调试步骤时,这个问题变得很长。我将把这些留给任何对此有问题的未来用户,但这里有一个简短的版本: 短版 使用putty,而不是使用“Dynamic”,这意味着它使用SOCKS,您应该使用“local”连接到SSH服务器 请看这里: 更改此选项修复了以下异常: java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: java.io.EOFEx

当我们完成调试步骤时,这个问题变得很长。我将把这些留给任何对此有问题的未来用户,但这里有一个简短的版本:

短版

使用putty,而不是使用“Dynamic”,这意味着它使用SOCKS,您应该使用“local”连接到SSH服务器

请看这里:

更改此选项修复了以下异常:

    java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
    java.io.EOFException
    at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
    at sun.rmi.server.UnicastRef.newCall(Unknown Source)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at java.rmi.Naming.lookup(Unknown Source)
    at TMAClient.main(Client.java:22)
Caused by: java.io.EOFException
第二个问题是对象没有使用正确的端口进行导出。这需要更改为在扩展UnicastRemoteObject的对象的构造函数中使用super(1099)

长版本

通过使用SSH隧道和RMI,我似乎非常接近让我的客户机与我的服务器对话,但我遇到了一个异常,我不知道为什么

服务器和客户端都在使用JRE 8,并且有一个授予所有权限的security.policy(目前)。我在同一台机器上运行时测试了服务器和客户机,这是可行的。然而,我现在尝试使用SSH tunel来绕过防火墙问题

在服务器运行的VM上,安装了FreeSSHd,并允许端口转发。在有客户端的机器上,我使用以下设置设置putty:

主持人: 端口:23(在路由器上正确设置为端口转发等)

连接/SSH/隧道: 源端口:1099 目的港:1099 动态 自动的

在客户端调用Naming.lookup()方法时,出现以下异常:

java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
    java.io.EOFException
    at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
    at sun.rmi.server.UnicastRef.newCall(Unknown Source)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at java.rmi.Naming.lookup(Unknown Source)
    at TMAClient.main(Client.java:22)
Caused by: java.io.EOFException
    at java.io.DataInputStream.readByte(Unknown Source)
    ... 6 more
HelloClient exception: java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
    java.io.EOFException
客户端上的代码如下所示:

System.setSecurityManager(new RMISecurityManager());
Naming.lookup("rmi://localhost/" + AUTH_OBJECT_BINDING);
我想这可能是因为putty中的一些设置错误,但我在诊断是什么导致这一问题时遇到了问题。我还尝试过使用源端口1098和目标端口1099,并将客户端更改为使用localhost:1098,但没有成功

我知道,如果我将命名查找中的端口更改为1099或1098以外的其他端口(取决于putty的设置),我会收到一个连接拒绝异常。这表明它正在连接,但有些地方出了问题

非常感谢您的帮助

在EJP建议的注释中添加VM参数后,我在启动时看到了这一点,但我还不确定这是否重要:

Jul 10, 2014 9:07:42 AM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(1)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: void rebind(java.lang.String, java.rmi.Remote)]
Jul 10, 2014 9:07:42 AM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(2)-127.0.0.1: [127.0.0.1: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)

注意-我尝试过使用或不使用“仅转发/绑定到本地主机”设置。

除非服务器使用代码库功能,否则客户端不需要安全管理器

使用JVM运行服务器

-Djava.rmi.server.logCalls=true

这样你就可以知道你是否连接到它了。请参阅以了解更多需要设置的内容:TCP传输日志也可能很有用。任何感兴趣的例外情况,请在此处发布

您的SSH隧道尚未正确设置。你能发布你的PUTTY tunnel配置屏幕的截图吗?注意:您不能在一台主机上运行所有这些,这与上面@ElliotFrisch的明显建议相反。您不能让SSH和RMI在两个不同的进程中监听同一个端口


PUTTY通道应在端口1099本地监听,并转发至远程端口1099。从您发布的内容中,我看不到这一点。

您能在局域网上运行吗?请在本地机器上通过隧道到服务器尝试rmi客户端。EOF表明有东西正在关闭连接,但这里确实没有足够的信息来诊断任何东西。您可以尝试在putty中启用verbose(如果可以的话)。您也可以尝试cygwin,因为openssh确实具有详细功能。除非服务器使用代码库功能,否则客户端不需要安全管理器。使用-Djava.rmi.server.logCalls=true和-Dsun.rmi.server.exceptionTrace=true运行服务器JVM,以便查看是否连接到它。请参阅以了解更多需要设置的内容:TCP传输日志也可能很有用。任何感兴趣的例外情况,请在此处发布。将它们编辑到您的问题中。这意味着您的SSH隧道尚未正确设置。你能发布你的PUTTY tunnel配置屏幕的截图吗?注意:您不能在一台主机上运行所有这些,这与上面@ElliotFrisch的明显建议相反。您不能让SSH和RMI在两个不同的进程中监听同一个端口。D1099是什么意思?它应该意味着在端口1099本地侦听并转发到远程端口1099。我从你的帖子上看不出来。
-Dsun.rmi.server.exceptionTrace=true