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

时间:2014-07-30 07:34:31

标签: java sockets networking network-programming netty

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

我脑子里有两种方法,问题是: 哪种方法更好,就服务器端的性能而言。你有更好的想法吗?

  1. 在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 
    
  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
    

2 个答案:

答案 0 :(得分:1)

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

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

平均hashmap访问时间:O(1)! (有关详细信息,请参阅此posting

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

你能做的是&#34;融合&#34;两个选项,所以你有地图可以轻松访问频道和ChannelGroup来处理困难的东西。您需要做的是在关闭时从地图中删除该通道。

答案 1 :(得分:0)

如何创建一个“UserInfo”对象,该对象包含用户名和相关频道?