与聊天应用程序java中的特定客户端进行狭窄的通信

时间:2013-05-04 03:16:06

标签: java multithreading sockets client chat

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

}

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

客户应该了解彼此的ID,以确保他们能够识别并向对方发送消息。因此,每当客户端向服务器发送数据包并且它包含接收客户端ID时,服务器应该查找散列映射。应检索接收套接字引用,并使用writer发送消息。

希望它有所帮助!