作者:冰河
QQ:2711098650
微信公众号: 冰河技术
mykit-chat是基于Netty实现的实时聊天系统服务器端,目前实现的功能如下:
- 支持昵称登录;
- 支持多人同时在线;
- 同步显示在线人数;
- 支持文字和表情的内容;
- 浏览器与服务器保持长连接,定时心跳检测;
- 服务器端使用Netty作为通信框架,支持客户端通过WebSocket通信。服务器会检测链路是否处于空闲,如果60秒内没有收到客户端的任何消息,那么服务器会主动关闭该链路。
- 为保证链路的可用性,服务器会定时发送Ping消息给客户端,客户端收到Ping消息后,必须回一个Pong消息响应,避免链路由于空闲而被关闭。
- 客户端连接服务器之后,需要提供昵称给服务器,服务器保存每一个用户的昵称和相关的链路信息,用于后续的聊天显示。
- 客户端发送聊天消息到服务器之后,服务器不会存储聊天消息,而是直接转发给其它的客户端。
协议比较简单,所有的消息都一个Json字符串,格式如下:
head | body | extend
- head作为头部,用int类型存储,4个字节;
- body 消息的有效载体,用string类型存储,长度无限度;
- extend 协议的扩展字段,用map类型存储;
由于在解码消息时使用的是Netty自带的WebSocket的解码器,只支持文本帧的消息,解码出来的都是一个完整的帧消息,即上面格式的消息,所以协议上没有用长度字段。
- mykit-chat-cache:mykit-chat项目的缓存模块,主要的功能是缓存客户端的连接信息和连接的管道信息等;
- mykit-chat-config: mykit-chat项目的配置模块,主要的功能是为项目提供统一的配置与获取配置项的入口;
- mykit-chat-constants:mykit-chat项目的常量模块,存储项目中所涉及的所有常量信息;
- mykit-chat-entity:mykit-chat项目的实体类模块,存储项目中所涉及的所有实体类信息;
- mykit-chat-netty: mykit-chat项目的核心模块,基于Netty实现的消息收发逻辑均在此模块实现;
- mykit-chat-proto:mykit-chat项目的协议模块,提供统一的协议封装;
- mykit-chat-utils:mykit-chat项目的通用工具类模块,提供统一的工具类;
- mykit-chat-core:mykit-chat项目的启动模块,也是整个项目入口;
整个服务端项目的启动类为mykit-chat-core模块下的io.mykit.chat.core.MykitChatStarter
类。
- 安装Maven;
- 下载mykit-chat,下载链接为:https://github.com/sunshinelyz/mykit-chat
- 在命令行将当前目录切换到mykit-chat下,如下所示
cd mykit-chat
- 执行Maven命令进行打包,如下所示
mvn clean package install
- 将mykit-chat-core模块下的target目录下的mykit-chat-core-1.0.0-SNAPSHOT-jar-with-dependencies.jar复制到需要运行项目的目录
- 执行如下命令运行mykit-chat服务端
nohup java -jar mykit-chat-core-1.0.0-SNAPSHOT-jar-with-dependencies.jar >> /dev/null &
- 项目支持在启动时动态设置主机名(IP地址)和端口,如果需要在启动的时候动态设置主机名和端口,则可以使用如下命令形式启动项目
nohup java -jar mykit-chat-core-1.0.0-SNAPSHOT-jar-with-dependencies.jar hostname(ip) port >> /dev/null &
如果在启动时,没有动态设置主机名(IP地址)和端口,则使用默认的主机名(IP地址)和端口,默认的主机名(IP地址)和端口在mykit-chat-config模块下的 src/main/resources目录下的websocket.properties文件中进行配置,默认的配置项如下所示:
default_host=localhost
default_port=8099
websocket_url=ws://localhost:8099/websocket
- 目前项目只是一个简单的聊天模型,需要不断优化升级;
- 目前服务器未存储任何消息记录,而是直接将消息转发给其他客户端;
- 目前项目仅支持将所有客户端接入到同一个聊天组中;
- 目前项目仅支持JVM本地缓存,未使用任何缓存数据库或中间件;
- 支持私聊;
- 支持多群组;
- 支持修改昵称,头像,增加个性签名;
- 支持发送图片、音频、视频、网页链接等;
- 支持语音、视频等;
- 消息体加密与解密;
- 接入Redis实现缓存数据,实现重启服务端,客户端不掉线;
- 其他待升级部分以后再定
你在刷抖音,玩游戏的时候,别人都在这里学习,成长,提升,人与人最大的差距其实就是思维。你可能不信,优秀的人,总是在一起。