选择线程与Java交互

时间:2014-12-19 23:50:00

标签: java multithreading sockets user-interaction

所以我有一个套接字情况,我有一个多线程服务器,它接收X个连接并管理所有这些(我使用这个代码作为我的基础:http://www.java2s.com/Code/Java/Network-Protocol/AmultithreadedSocketServer.htm)。这不完全是我的代码,但我用它作为多线程的基础:

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));)但是我需要列出所有我打开的线程并手动选择我要与之交互的线程。我怎么能这样做?

例如,我要向第一个套接字发送foofaa到第二个套接字。

1 个答案:

答案 0 :(得分:0)

所以我认为您需要创建一个应用程序,您可以在聊天应用程序中回复特定客户端。

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

您可以在给定方案中执行相同操作。您可以使用clientID来识别您需要回复的所需客户。但首先,您必须将客户端ID 映射到客户端的身份详细信息,例如Socket,IP和PORT。 [你可以让线程单独处理客户端的传入消息]

使用哈希映射进行映射[http://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html]并使用唯一客户端ID,这样您就不会发生任何冲突。并且作为哈希映射存储客户端的值在对象结构中详细说明[套接字,IP和PORT]。

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

  

您必须指定需要回复的客户端[在a   控制台应用程序提供客户端ID作为第一个单词或什么   机构]。

请询问我将尽力回答的任何澄清