在聊天应用程序java中缩小与特定客户端的通信范围
我刚刚创建了一个java聊天应用程序,允许多个客户端之间进行通信,但是,我还希望能够让一个客户端向特定客户端发送消息,而其他客户端无法看到消息发送,就像一个客户端对另一个客户端耳语一样。先谢谢你 这是我客户的一部分在聊天应用程序java中缩小与特定客户端的通信范围,java,multithreading,sockets,client,chat,Java,Multithreading,Sockets,Client,Chat,我刚刚创建了一个java聊天应用程序,允许多个客户端之间进行通信,但是,我还希望能够让一个客户端向特定客户端发送消息,而其他客户端无法看到消息发送,就像一个客户端对另一个客户端耳语一样。先谢谢你 这是我客户的一部分 public void sendListener(){ writer.println(clientName2+" : "+broadcastTF.getText() ); writer.flush(); broadcastTF.
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中的另一个线程来处理传入用户,而第一个线程仅处理消息。但是我想我的逻辑似乎不适用于你,然而,我觉得我必须修改很多代码,因为这不是我最初采用的方法。一半的时候,它认为我会找到一种方法来实现这一点。