再会,
我正在看这个教程来做一个 TCP 线程池服务器。 http://tutorials.jenkov.com/java-multithreaded-servers/thread-pooled-server.html
它非常适合监听/接收客户和处理,并返回响应。里面有一个类,我将 WorkerRunnable 传入,它基本上打印出远程套接字地址(它是从谁发送的)
public void run(){
synchronized(this){
this.runningThread = Thread.currentThread();
}
openServerSocket();
while(! isStopped()){
Socket clientSocket = null;
try {
clientSocket = this.serverSocket.accept();
} catch (IOException e) {
if(isStopped()) {
System.out.println("Server Stopped.") ;
return;
}
throw new RuntimeException(
"Error accepting client connection", e);
}
this.threadPool.execute(
new WorkerRunnable(clientSocket,
"Thread Pooled Server"));
}
this.threadPool.shutdown();
System.out.println("Server Stopped.") ;
}
问题是。远程地址应该保持固定(我在自己的家庭 wifi 路由器中工作)。但是,发件人的IP地址保持不变,但端口一直在变化!
这对我来说是个大问题......因为我需要能够为未来的任务向用户返回响应,并且我实际上保存了这个地址以再次用于发送数据。当我在单个 TCP 线程中运行它时……它保持固定(端口)。
为什么线程池会导致TCP远程地址端口不断变化?