【问题标题】:Send message to a client from server从服务器向客户端发送消息
【发布时间】:2014-07-30 07:34:31
【问题描述】:

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

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

  1. 在哈希图中使用用户名映射频道。

    //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 
    
  2. 使用用户名设置附件。

    //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
    

【问题讨论】:

  • 我认为您想根据用户名查找频道,而不是相反,所以您需要Map&lt;String, Channel&gt; ?
  • 第二种方法似乎要糟糕得多,因为“search”这个词,不过,第二种方法的变体似乎是可能的。现在我喜欢第一个。
  • @AndrewStubbs 感谢您的通知,已更正。
  • @keyser 从地图中删除频道怎么样?还是合乎逻辑的?

标签: java sockets networking network-programming netty


【解决方案1】:

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

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

平均哈希图访问时间:O(1)! (有关更多信息,请参阅此posting

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

您可以做的是“融合”这两个选项,因此您可以使用地图轻松访问频道,并使用 ChannelGroup 来处理困难的事情。您需要做的是在关闭时从地图中删除通道。

【讨论】:

  • 但我考虑的事情是处理连接锁存器和移除的通道,这可能会让人头疼并且对性能有效。而在第二种方法中,默认频道组会处理它。
  • 嗯,如果这个操作比访问频道的搜索要昂贵得多,那么如果它处理好这个操作,我会使用上下文。
  • 什么意思?你能解释更多吗?
  • 当我想到这个的时候,你不能两个都用吗? ChannelGroup和地图,轻松找到频道?但是你需要某种监听器,如果通道关闭,你可以将其从地图中移除。
  • 可以说我在扩展 SimpleChannelUpstreamHandler 的 ServerHandler 中执行此操作。我将用户名保留在处理程序中以及“为了性能”,然后从 channelClosed 事件的地图中删除基于其用户名的频道。这会是一个好的解决方案吗?
【解决方案2】:

如何创建一个“UserInfo”对象,其中包含用户的姓名和他的关联频道?

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 2015-01-05
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    相关资源
    最近更新 更多