Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从服务器向客户端发送消息_Java_Sockets_Networking_Network Programming_Netty - Fatal编程技术网

Java 从服务器向客户端发送消息

Java 从服务器向客户端发送消息,java,sockets,networking,network-programming,netty,Java,Sockets,Networking,Network Programming,Netty,我需要根据客户端的用户名从netty服务器向客户端发送消息。 因此,我需要用用户名映射频道,并在每次发送消息时找到频道 我有两种想法,问题是: 就服务器端性能而言,哪种方法更好。你有什么更好的主意吗 在hashmap中使用用户名映射频道 //Send userName from client side in first request //Get userName in server side and put it in a map Map<String, Channel> user

我需要根据客户端的用户名从netty服务器向客户端发送消息。 因此,我需要用用户名映射频道,并在每次发送消息时找到频道

我有两种想法,问题是: 就服务器端性能而言,哪种方法更好。你有什么更好的主意吗

  • 在hashmap中使用用户名映射频道

    //Send userName from client side in first request
    //Get userName in server side and put it in a map
    Map<String, Channel> userMap = new ConcurrentHashMap<String,Channel>();    
    //loop over userMap to find specific client 
    

  • 从您的代码中,我怀疑第二个选项使用线性搜索来查找特定频道。第一个选项将简单地执行get。(但在这种情况下,键必须是string)

    平均线性搜索时间:O(n/2)

    平均hashmap访问时间:O(1)!(有关更多信息,请参见此)

    这意味着如果你有更多的频道,线性搜索会变得更糟。hashmap选项更稳定,您可以期望几乎恒定的访问时间


    你可以做的是“融合”这两个选项,这样你就有了地图,可以轻松访问频道,也有了频道组来处理困难的事情。您需要做的是在通道关闭时将其从地图中删除

    创建一个“UserInfo”对象,保存用户名和相关频道,怎么样?

    我认为您希望根据用户名查找频道,而不是相反,因此您需要一个
    映射
    ?第二种方法似乎更糟糕,因为“搜索”一词,第二种方法的变体似乎是可能的。现在我喜欢第一个。@AndrewStubbs谢谢您的通知,更正。@keyser从地图中删除频道怎么样?还是逻辑的,但我认为处理连接锁存和删除通道,这可能是一个头痛和有效的性能。在第二种方法中,默认频道组会处理它。嗯,如果这个操作比搜索频道要昂贵得多,那么如果它处理好这个操作,我会使用上下文。你是什么意思?你能再解释一下吗?当我想到这一点时,你不能两者都用吗?频道组和地图,轻松找到频道?但是,您需要某种类型的侦听器,如果通道关闭,您可以将其从映射中删除。我还将用户名保存在处理程序中“为了性能”,然后从channelClosed事件的映射中删除基于用户名的通道。这是一个好的解决方案吗?
    //Set the attachment in client side
    ctx.getChannel().setAttachment(username);
    //Put all channels to a default channel group 
    //Get all channels, search in their attachments to find specific client