TCP-Server 不会 print/receive 来自远程客户端的数据
TCP-Server wont print/receive data from remote client
我遇到了一个奇怪的问题,
local 客户端 tcp 连接(python)到我的 tcp 服务器(java,在 windows 8 64 位上)正在工作。例如
Python client.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.2.108", 30000))
s.sendall('Hello, server')
s.close()
成功连接到 192.168.2.108 的 30000 端口,服务器在 eclipse 的控制台上打印 "Hello, server"。
如果我将接口更改为环回接口,它也可以工作。
如果我在我的远程Linux机器上使用相同的脚本(Arch with 3.18.6 kernel, 32-bit, ip: 192.168.2.104)服务器不会打印出任何东西。
如果我尝试在我的客户端上通过 nc 192.168.2.108 30000
连接 -> 同样的问题
如果我尝试在我的客户端上通过 telnet 192.168.2.108 30000
连接 -> 同样的问题(telnet:连接超时)
这是一段可能对问题很重要的代码。
背景故事是,服务器在自己的线程中创建了 3 个端口分别为 30000、40000、50000 的 serverSocket。
TCP.java
[...]
// pseudo-code: List<ServerSocket> serverSockets = {serverSocket1 port 30000,
// serverSocket2 port 40000, serverSocket3 port 50000}
[...]
for(ServerSocket serverSocket : serverSockets){
new Thread(new TCPRunnable(serverSocket)).start();
}
[...]
TCPRunnable.java
[...]
public TCPRunnable(ServerSocket serverSocket) {
this.serverSocket = serverSocket;
}
public void run() {
long threadId = Thread.currentThread().getId();
System.out.println(threadId + ": " + serverSocket);
// output: 20: ServerSocket[addr=0.0.0.0/0.0.0.0,localport=30000]
try {
System.out.println("before accept()");
while(true){
System.out.println("before accept() in while-loop");
Socket socket = serverSocket.accept();
String message = readMessage(socket);
System.out.println(threadId + ": " + message );
}
} catch (IOException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
System.out.println("leaving run");
}
[...]
`netstat -a | 的输出找到“30000”以查看正在侦听的端口
TCP 0.0.0.0:30000 be-dsktp:0 LISTENING
TCP [::]:30000 be-dsktp:0 LISTENING
希望有人能帮忙。
提前致谢。
防火墙挡住了路。在 firewall.cpl 中必须允许 javaw.exe。
谢谢子路!
我遇到了一个奇怪的问题, local 客户端 tcp 连接(python)到我的 tcp 服务器(java,在 windows 8 64 位上)正在工作。例如
Python client.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.2.108", 30000))
s.sendall('Hello, server')
s.close()
成功连接到 192.168.2.108 的 30000 端口,服务器在 eclipse 的控制台上打印 "Hello, server"。
如果我将接口更改为环回接口,它也可以工作。
如果我在我的远程Linux机器上使用相同的脚本(Arch with 3.18.6 kernel, 32-bit, ip: 192.168.2.104)服务器不会打印出任何东西。
如果我尝试在我的客户端上通过 nc 192.168.2.108 30000
连接 -> 同样的问题
如果我尝试在我的客户端上通过 telnet 192.168.2.108 30000
连接 -> 同样的问题(telnet:连接超时)
这是一段可能对问题很重要的代码。 背景故事是,服务器在自己的线程中创建了 3 个端口分别为 30000、40000、50000 的 serverSocket。
TCP.java
[...]
// pseudo-code: List<ServerSocket> serverSockets = {serverSocket1 port 30000,
// serverSocket2 port 40000, serverSocket3 port 50000}
[...]
for(ServerSocket serverSocket : serverSockets){
new Thread(new TCPRunnable(serverSocket)).start();
}
[...]
TCPRunnable.java
[...]
public TCPRunnable(ServerSocket serverSocket) {
this.serverSocket = serverSocket;
}
public void run() {
long threadId = Thread.currentThread().getId();
System.out.println(threadId + ": " + serverSocket);
// output: 20: ServerSocket[addr=0.0.0.0/0.0.0.0,localport=30000]
try {
System.out.println("before accept()");
while(true){
System.out.println("before accept() in while-loop");
Socket socket = serverSocket.accept();
String message = readMessage(socket);
System.out.println(threadId + ": " + message );
}
} catch (IOException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
System.out.println("leaving run");
}
[...]
`netstat -a | 的输出找到“30000”以查看正在侦听的端口
TCP 0.0.0.0:30000 be-dsktp:0 LISTENING
TCP [::]:30000 be-dsktp:0 LISTENING
希望有人能帮忙。 提前致谢。
防火墙挡住了路。在 firewall.cpl 中必须允许 javaw.exe。 谢谢子路!