• WING
    2020-01-08
    感谢老师的回答,继续上面的问题,极客这个留言做的不好啊,不能针对老师的回答提问,鄙视一下,哈哈。老师说netty不能提供session管理这种内置功能。我有个设想,老师看看合不合理:我觉得netty可以提供一个通用的session管理功能,无论业务用什么做id,其实只是session的一个属性,可以设置到channel的attr里,然后可以根据某个attr去反向查找对应的channel,例如在我的案例里,建立socket连接后,将设备号设置到channel的attr里,如果是别场景如用户id等等同理,然后session管理器提供一个根据attr的名称和值去查找对应的channel的接口。老师看这样OK不?

    作者回复: 可以是可以,但是反向查找效率低,一个服务器维持的连接越多,反向找效率越低,所以横竖还是单独维护一个正向查找的map比较好。你的这个设想没有问题,也能搞出来,也比较通用,问题就是效率有问题。个人看法。哈哈

    
    
  • WING
    2020-01-07
    老师,如果我需要服务器主动发消息到客户端怎么做?我的场景是有很多设备连接到了服务器,平时服务器不断接收设备数据,但有时需要人工触发从服务器发命令到设备(可以想象后台应用有个按钮,用户填了设备号,一点按钮,就发命令到对应的设备)。因为服务器主动发命令到设备,不是接收到设备的数据然后响应这种情况,我的难点是我怎么找回那个设备对应的channel?

    这个是几年前我做的一个案例,我的做法是,自己维护一个ConcurrentMap,设备连接上来时就将设备号和对应channel保存起来,用户点按钮时我就从这个Map里找回channel,相当于自己维护一个session表(我记得有一章有个同学也问了一个问题:netty怎么维护session的问题,应该也是有这种场景。我想如果netty提供一个类似session的组件就好了。),不知道我这么做正不正路,是否还有更好的办法?
    展开

    作者回复: 我觉得你的思路没有问题,想象下:netty肯定不提供这种内置的功能,因为你的是设备号,别人可能是别的id,本质都是一种map,所以需要业务层来维护,这种情况也确实类似session管理的方式,面临的问题也是一样的。另外假设你的设备本身也可以当服务器的话,你服务器端也可以实现一个客户端专门去做反向的消息发送,不然只能按照现在你的思路做。

    
    
我们在线,来聊聊吧