黑马程序员技术交流社区

标题: 【长沙校区】用Netty来实现 一个简单的聊天室,让我们聊... [打印本页]

作者: 长沙-小知姐姐    时间: 2019-1-2 10:51
标题: 【长沙校区】用Netty来实现 一个简单的聊天室,让我们聊...
本帖最后由 长沙-小知姐姐 于 2019-1-3 09:24 编辑



Java , 前端全网资源链接 : 【长沙校区】集合Java,前端所有基础入门,重点问题一览帖


在之前做的项 目中,涉及到了了会员跟客服之间的 网 页聊天功能,平时这块知识用的不不是很多, 网上也查了了相关资料料,都建议使 用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这个框架。


作者: 一个人一座城0.0    时间: 2019-1-3 08:31
看一看。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2