本帖最后由 长沙-小知姐姐 于 2019-1-3 09:24 编辑
在之前做的项 目中,涉及到了了会员跟客服之间的 网 页聊天功能,平时这块知识用的不不是很多, 网上也查了了相关资料料,都建议使 用Netty来进 行行实现,整个内容 比较多,这次主要是抛砖引 玉,我们就 用Netty来实现 一个 比较简单的聊天室。
需要注意的是,本篇 文章不不属于Demo,所以不不会有 入 门案例例部分,我们会直接进 行行实战,涉及到的NIO和Netty基础知识,需要 大家 自 己去学习了了解。
我会尽量量把整个开发流程都做完整,主要也是为了了 方便同学们的理解。
1. 准备工作
需要添加Netty的依赖,这里里使 用Netty4.
2. 辅助接口实现
增加辅助接 口的 目的就是为了了让我们的服务架构更更加清晰,此处包含两个接口, 一个 用来处理理Http请求, 一个 用来处理理WebSocket请求。
3. 请求处理理类WebSocketServerHandler
这个类继承了了SimpleChannelInboundHandler类,实现channelRead0() handlerAdded() handlerRemoved() exceptionCaught()等 几个 方法,第 一个是必选 方法,其他 方法供我们做 一些标记和后续处理理。
创建ChannelGroup,来保存每个已经建 立连接的channel,在handlerAdded() 方法中 file://localhost/Users/itcast/Library/Caches/TemporaryItems/msoclip/0/clip_image002.png
channels.add(ctx.channel());,相应的在handlerRemoved 方法中remove。
在channelRead0() 方法中,实现了了对请求的识别和分别处理理。
exceptionCaught() 方法为发 生异常时处理理。
4. 初始化实现类WebSocketServer
l.addLast(newWebSocketServerHandler(WebSocketServer.this, WebSocketServer.this)); 添加 自 己的响应处理理。WebSocketServerHandler是第 二点实现的请求处理理类. file://localhost/Users/itcast/Library/Caches/TemporaryItems/msoclip/0/clip_image002.png
private Map channelMap = newHashMap<>();来将ChannelId和CHannel对应保存。 方便便后来对应 file://localhost/Users/itcast/Library/Caches/TemporaryItems/msoclip/0/clip_image004.png
获取。
bootstrap.bind(host,port)也可以替换成仅bind端 口。
我们默认会给0.0.0.0端口开放服务。
handleHttpRequest和handleFrame是WebSocketService的 一个实现类。 file://localhost/Users/itcast/Library/Caches/TemporaryItems/msoclip/0/clip_image002.png
file://localhost/Users/itcast/Library/Caches/TemporaryItems/msoclip/0/clip_image004.png 对于每个细节都加了了详细的注释,请大家仔细看看注释。
5. 使 用一个main 方法启动服务
6,前端页面
socket = newWebSocket("ws://192.168.1.55:9999"); file://localhost/Users/itcast/Library/Caches/TemporaryItems/msoclip/0/clip_image002.png
这 里里需要注意ip地址和port与服务的 一 一对应关系。
socket.onmessage()是获取socket信息。socket.onopen是创建连接。socket.onclose是关闭连接。socket.send(message.value);是发送socket信息。
7. 这就是最终的测试效果
8. 要点总结
整个聊天室的实现 用的技术主要有Netty和WebSocket,这两个技术 目前 广泛 用于H5游戏,小游戏等场景,他们对于数据包 比较 小、数据交互频繁、延迟要求 高的情况都有 非常好的表现。
本 文只是抛砖引玉,后台并没有使 用SpringBoot整合Netty,前端也没 用使 用炫 目的效果,但主题思想能说明 一切问题,同学们如果需要实现类似的功能时,完全可以参照本篇教程的实现,只需略略作修改即可。
国内对Netty的研究比较少,这 方 面的书籍也不不多, 大家可以关注 一下Dubbo这个RPC框架,它的数据传输层其中就有采用Netty的实现,在阿 里里及各 大公司内部都 用的 比较多。
有志于从事游戏开发的同学们也可以多关注 一下Netty这个框架。
|