Java NIO 高性能服务器编程

发布于 2021-11-25 18:12:03 字数 239 浏览 770 评论 10

最近在研究如何使用NIO技术开发一个多用户在线的即时通讯工具,如题,请问各位大神:

1、如何架构服务器端设计能够增加系统的吞吐量和效率呢?

2、即时通讯过程中非常常见的就是客户端A发送信息给客户端B,使用NIO服务器端通过少量的线程去操作所有的Channel,而且他们都是基于事件的。我想问,当客户端A发送消息给客户端B时,服务器端如何判断B是否在线,并且迅速(高效率)地找到客户端B所对应的Channel进行写数据呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

清晨说ぺ晚安 2021-11-28 05:55:53

用netty吧 就可以少考虑这些问题 直接关注需求

清晨说ぺ晚安 2021-11-28 05:30:28

引用来自“fireflyc”的评论

无论是不是NIO,都无法做到“高效率的找到在线用户”

你必须自己维护一个routeTable一样的东西,里面放的有用户的id和channel,但是请注意,你必须处理如果channel close则需要删除routeTable对应的数据。

用户是否“在线”是没有办法判断的,特别是移动通讯的情况下。因为对物理链路的问题TCP/IP协议是无法探知的,所以你如果要保证“用户肯定能收到消息”就需要用request-response这样的机制。

好听的两个字的网名 2021-11-28 05:26:43

您说的对,心跳包是必须的,不过这个方案在一种情况下就不适用了:假设每个客户端发送心跳的频率为1秒钟,B客户端发送完心跳后掉线了(下一次心跳时间还没到),此时A客户端发送消息给B客户端,服务器则认为B客户端还在线,就将这条消息发送给B所对应的Channel,这时由于B不在线,所以服务器报异常。就在这之前是否有什么好的办法检测B是否连接正常,还是说我只能够使用try-catch方式来判断呢?

吃颗糖壮壮胆 2021-11-28 05:00:03

回复
再拉一次呗

沦落红尘 2021-11-28 04:40:31

可以通过保活或心跳包实现判断用户是否在线

伪装你 2021-11-28 02:40:08

谢谢,这个方法我考虑过,但是我在想是否这个方式在用户很多的时候效率会下降呢?另外,用户上线,下线,等这个map就会不断的插入和删除操作,一方面多线程map不是线程安全的,另一方面map内部貌似有排序的,这样子的话每次修改map中哪怕是一个信息都会导致整个map重排了?

画骨成沙 2021-11-28 01:18:50

回复
真要觉得很频繁的话就用concurrentHashMap

情绪失控 2021-11-28 00:35:31

服务器端维护一个map{用户iD,用户channle}

成熟的代价 2021-11-27 22:16:57

谢谢您的回答,您说“无法高效率查找在线用户“,那么服务器端需要发送消息给特定用户就得要自己写一张您所说的”route table“了,请问这个table一般是如何设计的呢?

凯凯我们等你回来 2021-11-26 20:24:20

无论是不是NIO,都无法做到“高效率的找到在线用户”

你必须自己维护一个routeTable一样的东西,里面放的有用户的id和channel,但是请注意,你必须处理如果channel close则需要删除routeTable对应的数据。

用户是否“在线”是没有办法判断的,特别是移动通讯的情况下。因为对物理链路的问题TCP/IP协议是无法探知的,所以你如果要保证“用户肯定能收到消息”就需要用request-response这样的机制。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文