以下是接受客户端套接字连接并为每个连接分配线程的代码(JAVA)。

 ServerSocket m_ServerSocket = new ServerSocket();

 while (true) {
            java.util.Date today = Calendar.getInstance().getTime();
            System.out.println(today+" - Listening to new connections...");

           Socket clientSocket = m_ServerSocket.accept();
           ClientServiceThread cliThread = new ClientServiceThread( clientSocket);
           cliThread.start();
 }


假设连接了5个客户端,因此正在运行5个线程。

client 1: threadId 11
client 2: threadId 12
client 3 :threadId 13
client 4 :threadId 14
client 5 :threadId 15


假设其中一个客户端发送一条消息“ kill-client1”,我希望最终客户端1的连接并使用ID 11终止线程,如下所示:

public void run() {
  try {
   BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
   PrintWriter out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

   while (running) {
    String clientCommand = in .readLine();

    if (clientCommand.equalsIgnoreCase("Kill-client1")) {
       // end the connection for client 1 & kill it's corresponding thread 11
    }
   }
 } catch (Exception e) {
  e.printStackTrace();
 }
 }


我该如何实现?

最佳答案

只需跟踪所有客户端套接字和/或处理线程即可。

Map<Integer,Socket> clients=new HashMap<>();

 while (true) {
            java.util.Date today = Calendar.getInstance().getTime();
            System.out.println(today+" - Listening to new connections...");

           Socket clientSocket = m_ServerSocket.accept();
           clients.put(generateNewClientId(),clientSocket);
           ClientServiceThread cliThread = new ClientServiceThread( clientSocket);
           cliThread.start();
 }


然后,如果您只是做

{
    if (clientCommand.equalsIgnoreCase("Kill")) {
       Socket socket=clients.get(idToShutDown);// get required id somehow (from request??)
       socket.close();
    }
}


这将关闭给定的套接字,从而导致处理线程中的in.readLine()中断,从而完成线程。

如果您跟踪线程,则可以设置“中断”标志,并在while条件下对其进行探测,以便您的处理线程能够正常完成工作。

10-07 20:40