Java - 异步套接字通道无法连接到远程异步服务器套接字通道

Posted

技术标签:

【中文标题】Java - 异步套接字通道无法连接到远程异步服务器套接字通道【英文标题】:Java - async socket channel cannot connect to remote async server socket channel 【发布时间】:2020-07-30 11:09:15 【问题描述】:

我创建并调试了一个使用AsynchronousSocketChannelAsynchronousServerSocketChannel 的简单网络应用程序,当通过localhost 访问它们时它们工作正常,但即使我将服务器应用程序移动到另一个设备,它也完全拒绝连接。当我尝试端口转发应用程序时,我首先注意到了这一点,但是在将其移动到同一网络上的设备上并通过 IPv4 连接时,它仍然无法正常工作。我检查了两个设备,它们都允许 Java 通过防火墙,并且没有任何东西阻止我正在使用的端口号(我还测试了其他各种端口)。如果客户端在同一台机器上并且您使用该机器的 IPv4,则客户端甚至无法连接到服务器。它实际上只适用于localhost。有没有其他人遇到过这个问题?

服务器通道是这样打开的:

serverSocket = AsynchronousServerSocketChannel.open();
serverSocket.bind(new InetSocketAddress("127.0.0.1", port));

【问题讨论】:

【参考方案1】:

通过删除InetSocketAddress 的 IP 部分来修复它:

serverSocket = AsynchronousServerSocketChannel.open();
serverSocket.bind(new InetSocketAddress(port));

用机器的IPv4替换127.0.0.1也有同样的效果。如果有人能解释这一点,那就太好了,因为我在网上看到的每个示例都绑定到localhostAsynchronousServerSocketChannels 不应该被远程访问吗?

【讨论】:

服务器的整个概念是由客户端远程访问。为什么要显式绑定到127.0.0.1 或IPv4 地址?您的设备有哪些网络接口没有运行? 在网上的例子中,我看到它们绑定到127.0.0.1,所以我认为你应该这样做。 但是当这不起作用时,你完全迷失了。所以假设事情有点危险。我问是因为this。 嗯,这似乎是有道理的,每个网站都在这样做,所以没有什么可做的了。我找不到指定打开服务器套接字通道的正确方法的 Oracle 文档。

以上是关于Java - 异步套接字通道无法连接到远程异步服务器套接字通道的主要内容,如果未能解决你的问题,请参考以下文章

ZeroMQ,异步阻塞套接字

重用异步套接字:后续连接尝试失败

邮件发送失败。无法连接到远程服务器。套接字操作

如何将java套接字连接到远程服务器套接字

在 Java (Android) 中连接到 IOCP 服务器

无法将客户端连接到 AWS 上的远程套接字