选择与Java交互的线程

选择与Java交互的线程,java,multithreading,sockets,user-interaction,Java,Multithreading,Sockets,User Interaction,所以我有一个套接字的情况,我有一个多线程服务器,它接收X个连接并管理所有连接(我使用下面的代码来建立我的:)。这不完全是我的代码,但我将其用作多线程的基础: import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.n

所以我有一个套接字的情况,我有一个多线程服务器,它接收X个连接并管理所有连接(我使用下面的代码来建立我的:)。这不完全是我的代码,但我将其用作多线程的基础:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {
  public static void main(String[] args) throws Exception {
    ServerSocket m_ServerSocket = new ServerSocket(12111);
    int id = 0;
    while (true) {
      Socket clientSocket = m_ServerSocket.accept();
      ClientServiceThread cliThread = new ClientServiceThread(clientSocket, id++);
      cliThread.start();
    }
  }
}

class ClientServiceThread extends Thread {
  Socket clientSocket;
  int clientID = -1;
  boolean running = true;

  ClientServiceThread(Socket s, int i) {
    clientSocket = s;
    clientID = i;
  }

  public void run() {
    System.out.println("Accepted Client : ID - " + clientID + " : Address - "
        + clientSocket.getInetAddress().getHostName());
    try {
      BufferedReader   in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
      PrintWriter   out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
      while (running) {
        String clientCommand = in.readLine();
        System.out.println("Client Says :" + clientCommand);
        if (clientCommand.equalsIgnoreCase("quit")) {
          running = false;
          System.out.print("Stopping client thread for client : " + clientID);
        } else {
          out.println(clientCommand);
          out.flush();
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
问题是,所有连接到我的客户端都在等待用户的响应,该用户使用键盘输入(BufferedReader SYSTEM_IN=new BufferedReader(new InputStreamReader(SYSTEM.IN));)提供响应,但我需要列出我打开的所有线程,并手动选择要与之交互的线程。我该怎么做


例如,我要将
foo
faa
发送到第一个套接字

因此,我认为您需要创建一个应用程序,在该应用程序中,您可以像在聊天应用程序中一样回复特定的客户机

我将提供一些你可以尝试的建议。在真实环境中,我们在聊天中所做的是,使用自己的聊天窗口向某人发送回复。这意味着我们使用某种ID来识别与我们交谈的人

您可以在给定场景中执行相同的操作。您可以使用
clientID
确定需要回复的客户。但首先,您必须将客户端ID映射到客户端的身份详细信息,如套接字、IP和端口。[您可以使用线程分别处理客户端的传入消息]

使用hash map进行映射[],并使用唯一的客户端ID,这样就不会发生任何冲突。作为散列映射的值,将客户机详细信息[套接字、IP和端口]存储在类似对象的结构中

每当您需要回复客户机时,请使用单独的reply函数,该函数将使用从哈希映射提取的套接字详细信息向特定客户机发送消息。答案的要点是:

您必须指定需要回复的客户机[在 控制台应用程序提供客户机ID作为第一个字或任何东西 机制]

请要求澄清,我会尽力回答