Java:将端口转发到 ServerSocket

标签 java networking sockets

我正在构建一个简单的服务器应用程序,我可以在本地网络中连接到它。但我无法通过互联网连接。

这是我的服务器代码:

ServerSocket server;
try {
    server = new ServerSocket(4000);
} catch(IOException ex) {
    System.out.printf("Could not bind socket 4000\n");
    System.exit(1);
}

try {
    Socket socket = server.accept();
    ClientThread client = new ClientThread(socket);
    client.start();
} catch(IOException ex) {
}

这是客户端:

try {
    System.out.printf("connecting...\n");
    Socket socket = new Socket("mydomain.org", 4000);
    System.out.printf("connected!\n");
} catch(UnknownHostException ex) {
    ex.printStackTrace();
} catch(IOException ex) {
    ex.printStackTrace();
}

我已经在我的路由器上转发了端口 4000,它应该可以工作。我以前转发过其他端口,例如 80 和 22。

当我运行客户端时,我得到“connecting...”字符串,它卡在那里。我没有得到“连接!”或堆栈跟踪。但正如我之前所说,它确实适用于本地网络。它在连接到 127.0.0.1 和使用 192.168.1.90 时有效。

我用了CanYouSeeMe.org检查端口是否打开。 80端口成功,4000超时。

最佳答案

查看4000端口绑定(bind)的是哪个ip地址。它可能只绑定(bind)到环回地址(127.0.0.1)而不是任何接口(interface)。

不确定您使用的是哪个操作系统,但要检查: Linux:netstat -ant Windows 和 Mac:netstat -anp tcp

在端口 4000 上查找 LISTEN 行,看看它是绑定(bind)到所有接口(interface)(*:4000 或 0.0.0.0:4000),还是绑定(bind)到特定接口(interface) (127.0.0.1:4000)。

如果它没有监听所有接口(interface),那是你的问题 - 使用允许你指定 BindAddress 的构造函数。

关于Java:将端口转发到 ServerSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1983747/

相关文章:

java - 正则表达式删除特殊字符(拉丁语1)

java - 当我尝试运行新的示例应用程序时,无法在Flutter中打开xmltree错误

java - jdbc string sql server 字符编码

linux - SCTP 在 Linux 上是否像宣传的那样工作?

sockets - 套接字编程Python

c++ - iOS Voip 唤醒电话

java - Apple Plist 转换为 Java 数据结构

objective-c - 使用元数据分块发送文件

java - UDP 套接字数据报接收数据包 2x 以获取完整消息

java - 如何改进从 Socket 读取 XML 的方式