Java NIO 高性能服务器编程
最近在研究如何使用NIO技术开发一个多用户在线的即时通讯工具,如题,请问各位大神:
1、如何架构服务器端设计能够增加系统的吞吐量和效率呢?
2、即时通讯过程中非常常见的就是客户端A发送信息给客户端B,使用NIO服务器端通过少量的线程去操作所有的Channel,而且他们都是基于事件的。我想问,当客户端A发送消息给客户端B时,服务器端如何判断B是否在线,并且迅速(高效率)地找到客户端B所对应的Channel进行写数据呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
用netty吧 就可以少考虑这些问题 直接关注需求
引用来自“fireflyc”的评论
无论是不是NIO,都无法做到“高效率的找到在线用户”
你必须自己维护一个routeTable一样的东西,里面放的有用户的id和channel,但是请注意,你必须处理如果channel close则需要删除routeTable对应的数据。
用户是否“在线”是没有办法判断的,特别是移动通讯的情况下。因为对物理链路的问题TCP/IP协议是无法探知的,所以你如果要保证“用户肯定能收到消息”就需要用request-response这样的机制。
您说的对,心跳包是必须的,不过这个方案在一种情况下就不适用了:假设每个客户端发送心跳的频率为1秒钟,B客户端发送完心跳后掉线了(下一次心跳时间还没到),此时A客户端发送消息给B客户端,服务器则认为B客户端还在线,就将这条消息发送给B所对应的Channel,这时由于B不在线,所以服务器报异常。就在这之前是否有什么好的办法检测B是否连接正常,还是说我只能够使用try-catch方式来判断呢?
回复
再拉一次呗
可以通过保活或心跳包实现判断用户是否在线
谢谢,这个方法我考虑过,但是我在想是否这个方式在用户很多的时候效率会下降呢?另外,用户上线,下线,等这个map就会不断的插入和删除操作,一方面多线程map不是线程安全的,另一方面map内部貌似有排序的,这样子的话每次修改map中哪怕是一个信息都会导致整个map重排了?
回复
真要觉得很频繁的话就用concurrentHashMap
服务器端维护一个map{用户iD,用户channle}
谢谢您的回答,您说“无法高效率查找在线用户“,那么服务器端需要发送消息给特定用户就得要自己写一张您所说的”route table“了,请问这个table一般是如何设计的呢?
无论是不是NIO,都无法做到“高效率的找到在线用户”
你必须自己维护一个routeTable一样的东西,里面放的有用户的id和channel,但是请注意,你必须处理如果channel close则需要删除routeTable对应的数据。
用户是否“在线”是没有办法判断的,特别是移动通讯的情况下。因为对物理链路的问题TCP/IP协议是无法探知的,所以你如果要保证“用户肯定能收到消息”就需要用request-response这样的机制。