我一直在尝试连接到我自己的 Java TCP 应用程序,该应用程序在具有静态公共 IP 的租用服务器上运行。
场景工作:
- 服务器运行主机应用程序,服务器来自https://check-host.net/连接到它。
- [我的] PC 同时运行主机和客户端应用程序并将它们连接起来。
适用场景不行:
- 服务器运行主机应用程序并且[我的] PC尝试连接(使用客户端应用程序,PowerShell Test-NetConnection,CMD telnet)
- [我的] PC 运行主机应用程序,服务器尝试连接客户端应用程序。
额外细节:
- 服务器和我的电脑能够互相 ping 通。
- 我尝试禁用 Windows 防火墙,但是无济于事。
- 我的电脑通过调制解调器连接到互联网(我不熟悉调制解调器的限制)
- 当尝试在我的 PC 上启动主机应用程序并将其当前公共 IP 指定为绑定地址时,Java 抛出了 IOException:“java.net.BindException:无法分配请求的地址:bind”。(租用的服务器执行相同的过程,没有问题)
[不再如此]对于那些想要尝试连接的人,我将让服务器保持运行:IP = **.***.***.** 端口 = 25 协议 = TCP(如果家里有人成功连接,那么我至少知道问题出在本地)
我完全不知所措,希望我提供的信息足以提示哪里出了问题。我感谢所有关于哪里可能出了问题的反馈。
提前致谢。
答案1
所以,你的问题实际上主要是这样的:
java.net.BindException:无法分配请求的地址:bind
这意味着程序没有正确启动。您将无法从远程或本地设备连接到它。
它无法在您的 PC 上运行的原因有两种。首先,在大多数操作系统上,绑定到 1024 以下的端口是一项特权操作。您需要管理员权限才能执行此操作。您正在尝试绑定到端口 25。
然后,“显而易见”的问题是:您的 PC 可能实际上没有您的公共 IP 地址。如今,直接连接到互联网(不通过路由器)的情况极为罕见。相反,路由器有公共 IP 地址。您的“调制解调器”实际上可能就是路由器。或者您可能位于运营商级 NAT(CGNAT)之后。这将导致您无法接受传入连接。
在你的电脑上,你必须使用其本地 IP 地址(例如192.168.123.123)。在您的路由器上,您必须设置端口转发。
dave_thompson_085 还特别提出了有关端口 25(SMTP)的有效端口:由于此端口上的流量具有垃圾性质,因此许多 ISP 都将其阻止,即使它们允许传入连接。
答案2
通过评论和@DanielB 提供的信息,我能够解决这个问题。
- 首先:我改变了端口号大于 1024(不知道这是否有帮助,但是为了安全起见还是这么做的)。
- 其次,我访问了我的 ISP 的网站,启用端口转发我新选择的港口。
现在应用程序可以双向正常连接。虽然我也了解到我要在 PC 上使用本地 IP 进行托管,但要从服务器连接到 PC 的公共 IP。
感谢大家的意见!如果没有你们的帮助,我不可能这么快就解决这个问题。