在聊天应用程序java中缩小与特定客户端的通信范围

在聊天应用程序java中缩小与特定客户端的通信范围,java,multithreading,sockets,client,chat,Java,Multithreading,Sockets,Client,Chat,我刚刚创建了一个java聊天应用程序,允许多个客户端之间进行通信,但是,我还希望能够让一个客户端向特定客户端发送消息,而其他客户端无法看到消息发送,就像一个客户端对另一个客户端耳语一样。先谢谢你 这是我客户的一部分 public void sendListener(){ writer.println(clientName2+" : "+broadcastTF.getText() ); writer.flush(); broadcastTF.

我刚刚创建了一个java聊天应用程序,允许多个客户端之间进行通信,但是,我还希望能够让一个客户端向特定客户端发送消息,而其他客户端无法看到消息发送,就像一个客户端对另一个客户端耳语一样。先谢谢你

这是我客户的一部分

    public void sendListener(){
        writer.println(clientName2+" : "+broadcastTF.getText() );
        writer.flush();
        broadcastTF.setText("");
        broadcastTF.requestFocus();
    }

    public class listenServer implements Runnable{

        public void run(){
            try{
         String text;
            while((text = reader.nextLine()) != null){
                messageTA.append(text+ "\n");
            }
            }catch(Exception ex){}
        }
    }


private void setupServer(){
    try{
    socket = new Socket("127.0.0.1", 7894);
    writer = new PrintWriter(socket.getOutputStream());
    reader = new Scanner(socket.getInputStream());
    listenServer ls = new listenServer();
    Thread t = new Thread(ls);
    t.start();
    }
    catch(Exception ex){

    }
}
这里是我服务器的一部分

public class listenToClient implements Runnable{
Scanner reader;
public listenToClient(Socket socket){
    try{
        reader = new Scanner(socket.getInputStream());
    }catch (Exception ex){}
}

public void run(){
    try{
        String text;
        while((text = reader.nextLine()) != null){
                            sendToAll(text);

        }
    }catch(Exception ex){}
}

public void sendToAll(String text){
    for (PrintWriter w : writers){
        try{
            w.println(text);
            w.flush();
        }catch(Exception ex){}
    }
}

}

我认为这与特定代码关系不大,与总体设计关系更大

首先,你需要一些识别个人客户的方法。如果需要快速查找,可以使用某种键/值映射来存储
编写器
,并使用唯一ID(用户名、用户ID、一些随机字符串或适合您情况的任何内容)作为键。如果这不是一个问题,那么您可以将客户端连接存储在一个简单的数字数组(或类似数组的结构)中,并进行迭代,直到找到目标,然后以独占方式发送到该连接

然后,发送客户端需要能够识别其目标是什么,并且还需要有一些方法将目标信息与消息一起发送。仅仅在服务器上读取输入并将其回显是不够的——您必须进行一些解析,并且您可能需要设计一些格式来安排这些信息


例如,我设计的一种客户机-服务器通信格式将消息的第一个字节设置为密钥/值对中密钥的长度。服务器将读取第一个字节,然后读取下一个N字节作为密钥。剩下的字节就是已知的值。在您的情况下,密钥长度为0意味着它不会发送到某个特定的目的地,而是发送到每个人。

创建一个客户端集合,如hashmap。因此,每当您获得一个新的客户机连接accept时,为该客户机分配一个id,并将其套接字引用与hashmap中的id相对应

客户机应该知道彼此的ID,以确保他们能够识别并相互发送消息。所以,每当客户机向服务器发送一个数据包并包含一个最近的客户机id时,服务器都应该查找hashmap。应检索最近的套接字引用,并使用writer发送消息


希望有帮助

您自己采取了哪些步骤来解决这个问题?它是如何工作的?我尝试使用ArrayList和other中的另一个线程来处理传入用户,而第一个线程仅处理消息。但是我想我的逻辑似乎不适用于你,然而,我觉得我必须修改很多代码,因为这不是我最初采用的方法。一半的时候,它认为我会找到一种方法来实现这一点。