長すぎるによるSocket.accept(のためにブロックされているスレッドを終了する方法)?

フイ・ダックル:
public class Slave implements Runnable {
   public ServerSocket slaveSocket;

   public Slave(ServerSocket sk) {socket = sk;}

   @Override
   public void run() {
      Socket client = slaveSocket.accept(); // slave will wait to serve a client
      // more code...

      Socket clientPart2 = slaveSocket.accept();
      // more code...
   }
}

public class Server {
   public static void main(String[] args) {
       // for example only, incomplete code
       ServerSocket serverSocket = new ServerSocket(0); // a client connect to 8088
       Slave slave = new Slave(serverSocket);
       new Thread(slave).start(); // slave serve the current client, the server wait for new client

       // send new slave's port to client ... 
   }
}

私は一度に複数の顧客にサービスを提供しているサーバーを持っているので。たびクライアントが接続すると、サーバは、クライアントがスレーブで動作します、クライアントにそのスレーブのIP /ポートを送信する、新しいスレーブを作成します。

しかし、クライアントは、スレーブのアドレスを受信した場合、その後何もしない(または終了)(編集:それは、クライアントとサーバが接続されることを意味しますが、クライアントには何もしない、例えばユーザーが昼食に行くので)slaveSocket.accept()そのスレーブスレッドが永遠に実行するようになり、これは無駄です。

私は待っているの30秒後の出口にスレーブスレッドをしたいですslaveSocket.accept()以来slaveSocket.accept()ブロックしている、私は内側からそれを行うことはできませんvoid run()

この問題を解決する正しい、きれいな方法は何ですか?ありがとうございました。

編集1:クライアントがそのスレーブに接続する複数のプロセスを持つことができるので、ServerSocketをスレーブに渡されます。だから、ただ一つの機能を実行しません。

ジョニ:

あなたはsetSoTimeoutなしクライアントの接続先でタイムアウトを設定した場合、ServerSocket.acceptは例外をスローします。あなたはこの例外をキャッチすることができます。

30秒、使用のタイムアウトを設定するには:

serverSocket.setSoTimeout(30000)

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=401338&siteId=1