Java 从服务器向客户端发送消息
我需要根据客户端的用户名从netty服务器向客户端发送消息。 因此,我需要用用户名映射频道,并在每次发送消息时找到频道 我有两种想法,问题是: 就服务器端性能而言,哪种方法更好。你有什么更好的主意吗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
//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