当前位置:   article > 正文

基于Netty实现的聊天室——附源码!_netty高级-网页版聊天源码

netty高级-网页版聊天源码
  • 1. 概述

  • 2. 构建 Netty 服务端与客户端

  • 3. 通信协议

  • 4. 消息分发

  • 5. 断开重连

  • 6. 心跳机制与空闲检测

  • 7. 认证逻辑

  • 8. 单聊逻辑

  • 9. 群聊逻辑

本文在提供完整代码示例,可见 https://github.com/kaixuanzhang123/springboot-netty.git

原创不易,给点个 Star 嘿,一起冲鸭!

 Netty 是一个 Java 开源框架。

Netty 提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

也就是说,Netty 是一个基于 NIO 的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。

Netty 相当简化和流线化了网络应用的编程开发过程,例如,TCP 和 UDP 的 Socket 服务开发。

 下面,我们来新建三个项目,如下图所示:

 测试demo:localhost:8081/test/mock?type=CHAT_SEND_TO_ALL_REQUEST&message={"msgId":"1","content":"sss"}

 

项目总结:

通信粘包与拆包

我们实现了客户端和服务端的连接功能。而本小节,我们要让它们两能够说上话,即进行数据的读写

在日常项目的开发中,前端和后端之间采用 HTTP 作为通信协议,使用文本内容进行交互,数据格式一般是 JSON。但是在 TCP 的世界里,我们需要自己基于二进制构建,构建客户端和服务端的通信协议。

我们以客户端向服务端发送消息来举个例子,假设客户端要发送一个登录请求,对应的类如下:

 产生原因

产生粘包和拆包问题的主要原因是,操作系统在发送 TCP 数据的时候,底层会有一个缓冲区,例如 1024 个字节大小。

  • 如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP 则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题。

    例如说,在《详解 Socket 编程 --- TCP_NODELAY 选项》文章中我们可以看到,在关闭 Nagle 算法时,请求不会等待满足缓冲区大小,而是尽快发出,降低延迟。

  • 如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP 就会将其拆分为多次发送,这就是拆包,也就是将一个大的包拆分为多个小包进行发送。

如下图展示了粘包和拆包的一个示意图,演示了粘包和拆包的三种情况:

 

  • A 和 B 两个包都刚好满足 TCP 缓冲区的大小,或者说其等待时间已经达到 TCP 等待时长,从而还是使用两个独立的包进行发送。

  • A 和 B 两次请求间隔时间内较短,并且数据包较小,因而合并为同一个包发送给服务端。

  • B 包比较大,因而将其拆分为两个包 B_1 和 B_2 进行发送,而这里由于拆分后的 B_2 比较小,其又与 A 包合并在一起发送。

解决方案

对于粘包和拆包问题,常见的解决方案有三种:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/355062
推荐阅读
相关标签