フイ・ダックル:
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)