个人技术博客:netty构建聊天服务器

个人技术博客:netty构建聊天服务器

技术概述

Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序dsf。我们的项目主要使用netty实现一个异步的聊天服务器,同时用于处理前端一些需要实时处理的用户行为,如用户的消息签收,用户的心跳维持,重新拉取好友等动作的实时传递,是一款易于使用的 API 的客户端/服务器框架。

技术详述

主要使用netty用于用户的聊天相关的事件,下面我简单介绍一下用netty构建的聊天服务器其中使用的相关技术。
先简单展示一下使用netty构建的服务器其中我们拓展的字段并阐述大致功能。

聊天服务器的初始化

这部分主要提供聊天室初始化的一些handler,添加 ChannelHandler 到 ChannelPipeline,并且提供必要的注释供拓展。

心跳支持

使用心跳检测维持用户的在线状态,这其中包含读空闲、写空闲还有读写空闲的判断。

聊天

因为聊天中私聊和群聊的实现和思路类似,其中群聊需要对用户进行广播,这里聊天就只取群聊来作例子展示。

首先,因为我们的项目中特别要求,对聊天室有时间的限制,所以我们开始聊天前需要使用一个字段判断聊天室当前的状态。

接下去,若聊天室处于正常开启状态,接下去开启聊天的动作行为,下面展示一下聊天室handler的处理。

消息的签收

这部分,因为考虑到用户的离线状态,无法对消息进行实时的签收,所以我们对离线用户的消息签收在数据库加了个签收判断字段,同时对用户的状态进行判断并消息签收。
下面,因为私聊和群聊类似,我这里只展示群聊的消息签收。

其余部分字段的功能和实现类似,虽然现在我觉得用netty构建的服务器对用户的登陆状态进行判断有点不合理,但是当时考虑的是后端实时对被封禁用户和聊天室的状态进行判断并处理,所以在netty服务器中应用了如此多的字段进行判断,不过之后我也学到了新知识,这部分判断还是可以完善加强的。

技术使用中遇到的问题和解决过程。

项目中,遇到的主要问题就是用户的被封禁用户实时接收到消息并将其进行退出登陆操作,这部分当时想了很久,怎么通过这个服务器实现对用户状态变化的实时监测呢,困于这部分,想了好久,突然意识到有个心跳的维持,既然心跳能实时定时检测用户目前的在线离线状态,我就把这部分用户的状态检测也放进去这部分进行实时的检测,这样有助于被封禁用户能即时的退出登陆,给用户更好的体验。这个问题解决或还是挺开心的,当时觉得想了这么久的东西一下子找到能利用的地方真的十分开心。

总结

说实话,一开始我觉得实现一个聊天服务器对于我来说难度太过大了,去看那些专业文档和一些教程也许久没有头绪,其中一些内部封装的细节实在理解不来,但是深入了解之后,感觉,哇,这东西真厉害,原来还可以这么做,与websocket相比自己构建的聊天服务器构建完成后真的很自豪,学习到了很多,到后面,真的和前端一起测试时,发现竟然只有一些拼写错误,一会儿解决后边正常聊天,看到消息被正常接收和签收的瞬间,真的十分高兴,觉得自己的努力是值得的,真的,在这次软工实践中,能学到一门netty技术,真的很充实高兴。

参考文献、参考博客

w3c技术文档
Netty 4.x

posted @ 2020-06-15 22:50  Hkb  阅读(636)  评论(1编辑  收藏  举报