0

再会,

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

4

2 回答 2

2

使用 TCP,客户端套接字端口大部分时间(几乎 99%,除了特定协议)是随机选择的。但对你来说不必知道,你唯一需要做的就是保留将clientSocket数据写回客户端的引用。如果要在连接关闭后向另一台主机发送数据,则必须ServerSocket在两端启动一个固定端口。

于 2013-06-10T15:29:18.820 回答
0

即使您在同一台机器上进行测试,默认情况下客户端端口也是随机的。我不确定是否有任何方法可以设置客户端源端口。但是,如果您使用 netstat 或捕获数据包,您可以确定每个连接的源端口都不同。

于 2020-06-21T19:17:50.767 回答