gpt4 book ai didi

使用隧道的 Java RMI - 一个异常(exception)

转载 作者:行者123 更新时间:2023-12-01 12:46:28 24 4
gpt4 key购买 nike

随着我们进行调试步骤,这个问题变得很长。我会将这些留给 future 遇到问题的用户,但这里有一个简短的版本:

简短版本

使用putty,而不是使用“动态”(这意味着它使用SOCKS),您应该使用“本地”连接到SSH服务器。

请参见此处:https://serverfault.com/questions/272754/what-is-the-difference-between-local-remote-dynamic-ssh-tunneling

更改此设置修复了以下异常:

    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 隧道来解决防火墙问题。

在运行服务器的虚拟机上,安装了 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);

我认为这可能是因为腻子中的设置存在一些错误,但我在诊断导致此问题的原因时遇到问题。我还尝试过使用源端口 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)

putty tunnel config connection freeSSH - server side

注意 - 我已经尝试过使用和不使用仅转发/绑定(bind)到本地主机设置。 enter image description here connected

最佳答案

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

运行服务器 JVM

-Djava.rmi.server.logCalls=true

-Dsun.rmi.server.exceptionTrace=true

这样您就可以查看是否正在连接到它。请参阅this page要设置更多内容:TCP 传输日志记录也很有用。任何感兴趣的异常(exception)情况,请在此处发布。

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

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

关于使用隧道的 Java RMI - 一个异常(exception),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24655502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com