Java Threadpool TCP 服务器(端口不断变化!!)

标签 java tcp threadpool

美好的一天,

我正在看这个教程来制作 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远程地址端口不断变化?

最佳答案

对于 TCP,客户端套接字端口在大多数情况下(几乎 99%,除了特定协议(protocol))是随机选择的。但您不必知道这一点,您唯一要做的就是保留 clientSocket 引用以将数据写回客户端。如果您想在连接关闭后向另一台主机发送数据,则必须在两端启动具有固定端口的ServerSocket

关于Java Threadpool TCP 服务器(端口不断变化!!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17027111/

相关文章:

multithreading - 为什么我的 Futures 没有最大化 CPU?

java - 通过 jni NewByteArray 在何处释放分配的内存

java - 该 xml 文件的 jaxb 注释应该是什么?

java - 使用 Junit 5 和 Spring Boot 2 在 Mokito 2 中未发现测试

c++ - 通过防火墙代理将 Arduino 连接到 Internet

c# - IAsyncResult 与线程池

java - 即使文件位于同一个包中,也找不到这样的文件或目录

c# - C#Unity和C服务器中的TcpClient

c# - TCPClient - 一段时间后停止接收数据

c# - 为什么 SocketAsyncEventArgs 的 Completed 回调经常在新创建的线程中执行,而不是使用有界线程池?