我刚刚创建了一个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。因此,每当您获得新的客户端连接接受时,请为此客户端分配一个id,并将其套接字引用与hashmap中的id相对应。
客户端应该知道彼此的id,以确保他们可以识别并相互发送消息。因此,每当客户端向服务器发送包含接收客户端id的数据包时,服务器应该查找hashmap。应该检索接收套接字引用,并使用写入器发送消息。
希望有帮助!