[英]Java Server Socket Interrupt How to
如何停止正在監聽客戶端的服務器套接字。 我的代碼如下所示
private ServerSocket serverSocket;
class ServerThread implements Runnable {
private BufferedReader input;
public void run() {
Socket socket = null;
try {
serverSocket = new ServerSocket(SERVE_LISTEN_RPORT);
} catch (IOException e) {
e.printStackTrace();
}
while (!Thread.currentThread().isInterrupted()) {
try {
socket = serverSocket.accept();
try {
this.input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
try {
String read = input.readLine();
//Do something
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
當我從另一個線程收到命令時,我需要停止該線程。 我已經播出了這個問題,但不知道如何實現。
這是一個如何從其他線程關閉套接字的示例:
private static volatile ServerSocket serverSocket;
public static void main(String[] args) throws InterruptedException, IOException {
Thread serverThread = new Thread(new ServerThread());
serverThread.start();
Thread.sleep(1000); // wait a bit, then close
serverSocket.close();
}
static class ServerThread implements Runnable {
private BufferedReader input;
public void run() {
try {
serverSocket = new ServerSocket(25);
while (true) {
Socket socket = serverSocket.accept();
// client request handling logic
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服務器套接字應在run()
方法外部,並應由線程共享 。
現在,當您需要中斷正在調用socket.accept()
的線程時,另一個線程可以調用socket.close()
, accept()
將引發異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.