0

我刚刚创建了一个允许多个客户端之间通信的 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){}
    }
}

}

4

2 回答 2

0

创建客户端集合,例如 hashmap。因此,每当您获得新的客户端连接接受时,请为此客户端分配一个 id 并将其套接字引用与该 id 放在 hashmap 中。

客户端应该知道彼此的 id,以确保他们可以识别并发送消息给对方。因此,每当客户端向服务器发送一个数据包并且它包含一个接收客户端 ID 时,服务器应该查找 hashmap。应检索接收方套接字引用,并应使用编写器发送消息。

希望能帮助到你!

于 2013-05-04T04:03:07.090 回答
0

我认为这与特定代码的关系较小,而与整体设计有关。

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

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

例如,我设计的一种客户端-服务器通信格式让消息的第一个字节是键/值对中键的长度。服务器将读取第一个字节,然后读取接下来的N个字节作为密钥。然后知道剩余的字节是值。在您的情况下,密钥长度为 0 意味着它不会去往一个特定的目的地,而是去往所有人。

于 2013-05-04T03:32:19.123 回答