【问题标题】:Java - server networking specific client chatJava - 服务器网络特定客户端聊天
【发布时间】:2015-11-02 18:08:21
【问题描述】:

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

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 将连接到服务器并创建另一个名为“香蕉”的聊天组,其他客户端可以加入其中并在那里交谈。

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

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

【问题讨论】:

  • 嗨@Pam,你做了其他测试吗?

标签: java networking server chat


【解决方案1】:

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

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 类。

【讨论】:

    【解决方案2】:

    对于性能方面,我建议你看看 Java nio,nio2。使用 nio,您可以以异步方式处理连接,并且每个连接不会浪费 1 个线程。标准套接字实现有一些缺点。

    作为您的问题的解决方案,我希望将发送/接收的消息的标题和内容分开。在标题中会有源用户、目标用户/组等信息。 您的客户将理解消息并将消息打印到具有正确发件人的相关聊天窗口中。

    在服务器端,您可能有 用户映射哪个键是用户名,值是用户对象。 ChatGroups 映射哪个键是组名,值是用户名列表。 由于关系是多对多的,因此您还需要保留用户的所有参与组。要么在用户对象中放置一个 groupNameList,要么定义一个单独的映射。

    侦听客户端套接字 onClose 操作(可能使用 nio)并使用阻塞机制(并发)从组或地图中删除用户

    另外添加新组、用户等也需要线程并发。

    【讨论】:

    • 放下它。 OP不需要NIO,是初学者。 NIO所谓的性能优势根本不会表现出来,如果有的话,直到有成千上万的客户。保持相关性。
    • @EJP nio 不是答案,只是一个很好的建议。对于任何对此有所了解的 Java 开发人员来说,这都是更好的选择。建议的解决方案在我的答案的其余部分(大约占总数的 80%)。请完整阅读答案,因为人们正在为此花时间。
    猜你喜欢
    • 2016-04-09
    • 2017-07-06
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    相关资源
    最近更新 更多