Java - 服务器网络特定的客户端聊天

标签 java networking server chat

我创建了一个简单的聊天服务器,它向所有连接的客户端写入信息(为了简单起见,我只发布了核心代码)

public class server extends Thread {

private Socket clientSocket;
private static ArrayList<Socket> sockets = new ArrayList<Socket>();

public server(Socket clientSocket) {
    this.clientSocket = clientSocket;
    sockets.add(clientSocket);
}

public void run() {
    while (true) {
        try {
            for(Socket s: sockets) {
            //write something
            //the for loop will send it to every socket in the array
            }
        } catch (Exception e) {
            //catch it
        }   
    }    
}
}   

现在我想更具体地说明我想将消息发送到哪个客户端,就像真实世界的聊天应用程序将如何拥有不同的聊天室一样。

因此,如果 Client1 连接到服务器,他将要启动一个名为 “苹果”。然后当Client2和Client3连接时,他们可以选择加入组“Apple”。同时,客户端 4 将连接到服务器并创建另一个名为“Banana”的聊天组,其他客户端可以加入并在那里聊天。

我的理解是我需要以某种方式识别服务器接受的每个客户端(我不知道如何实现它)。然后我是否根据他们的群聊名称以某种方式将它们全部放入自己的数组中?

我一直在寻找过去一周的示例代码,这些代码允许同时进行 1 个以上的群聊,但我看到的所有内容都只适合 1 个。

最佳答案

最简单的解决方案是使用 hashmap,键 = 房间名称,值 = 聊天中的用户列表。在实践中:

HashMap<String, ArrayList<Socket>> rooms = new HashMap<>();

当一个新用户连接时,它应该发送一条消息,其中包含他想要加入的房间的名称,然后您可以检查该房间是否已经存在:

ArrayList<Socket> clientsList = rooms.get(roomName);
if(clientsList == null) {
    clientsList = new ArrayList<Socket>();
    rooms.put(roomName, clientsList);
}
clientsList.add(socket);

另一个好主意是创建一个包含 Socket 以及其他信息(例如用户名)的 Client 类。

关于Java - 服务器网络特定的客户端聊天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31926136/

相关文章:

java - 将远程文件流式传输到文件对象中

java - 这个线程能不能存活以及如何使用java.lang.Thread.join()方法

java - 找不到符号方法元工厂(Lookup,String,MethodType,MethodType,MethodHandle,MethodType)

networking - 如何以可以连接到互联网的方式启动具有静态 IP 地址的临时 lxc?

java - 与 Apache Mina 同步线程时出现问题

visual-studio-2010 - Visual Studio 测试不会在网络共享上运行

dns - 网站服务器更改后奇怪的谷歌结果

php - 无法将移动设备连接到本地 MySQL 数据库,但可以使用模拟器工作

java - 如何处理属性文件中的类别?

html - 使用 SSE 发送图像数据