0

良い一日、

このチュートリアルを見て、TCP Threadpool サーバーを実行しました。 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 に答える