有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程选择与Java交互的线程

因此,我有一个socket环境,其中我有一个多线程服务器,它接收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发送到第一个socket


共 (1) 个答案

  1. # 1 楼答案

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

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

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

    使用hash-map进行映射[http://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html],并使用唯一的客户端ID,这样就不会发生任何冲突。作为散列映射的值,将客户机详细信息[套接字、IP和端口]存储在类似对象的结构中

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

    you will have to specify which client you need to reply to [In a console application Provide client ID as first word or what ever mechanism].

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