gpt4 book ai didi

java - 在不同网络上使用 RMI

转载 作者:行者123 更新时间:2023-12-01 11:55:41 26 4
gpt4 key购买 nike

访客的计算机可以位于服务器之外的网络上。如果不是,则一切正常,但如果是,则会抛出ConnectException

你知道为什么吗?

额外信息:我将端口从1099(默认)修改为80来尝试解决问题,但不起作用。使用 Wireshark,我看到访客正在使用端口 50740。我不明白为什么,以前从未见过这个号码。我使用 .policy 文件授予所有权限。

编辑:我已经有由 .bat 定义的服务器 IP。我的客户端的开头还有 Locate.createRegistry(80); 。让客户端使用端口 80 就足够了吗?

奇怪的是,我可以尝试登录(我的应用程序在启动时要求登录),看看我的凭据是否正常。然后,如果客户端不在同一网络上,则会抛出 ConnectException

最佳答案

I modified the port from 1099 (default) to 80 to try to solve the problem, doesn't work. Using Wireshark, I saw that guest were using port 50740. I don't understand why, and never saw this number before.

当 RMI 客户端想要与远程对象通信时,它通常首先联系端口 1099 上的 RMI 注册表,询问在哪里可以找到目标对象。注册表回复一个包含目标对象地址(主机名和端口号)的 stub ,然后客户端可以连接到目标主机和端口以与远程对象通信。

如果您在调用 UnicastRemoteObject 父类(super class)构造函数或静态 exportObject 方法时未指定显式端口号,则 RMI 将选择一个随机的可用端口号使用。这可能就是 50740 的来源 - 它是目标对象正在监听的端口,而不是注册表。

但目标对象地址的第二个元素是主机名 - 如果该对象在注册表中以 127.0.0.1:50740 这样的地址列出,那么另一台计算机上的客户端将结束尝试连接到错误位置的对象(在客户端的本地主机而不是服务器的本地主机上)。解决方案是确保对象在注册表中绑定(bind)在可从客户端解析的正确主机名或 IP 地址下 - 理论上这应该自动发生,但有时 RMI 会出错。解决方案是将系统属性传递给 RMI 服务器(在注册表中绑定(bind)目标对象的进程)

java -classpath .... -Djava.rmi.server.hostname=192.168.0.1 com.example.MyRmiServer

192.168.0.1 替换为客户端计算机用于与服务器通信的正确 IP 地址。

关于java - 在不同网络上使用 RMI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28457666/

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