使用Netty搭建一个网络聊天室
目录
一、引入
1.1 简单对比
1.1.1 本地专用客户端(JavaFX/Swing/控制台等)
1.1.2 纯 Web 前端(浏览器即可)
1.2 图示
二、 原理
三、 实现框架
四、 是否连接数据库?
五、代码附上(以JavaFX+Netty为例)
一、引入
用 Netty 搭聊天室时,确实可以按“客户端形态”分成两条路线:
💡
1.1 简单对比
1.1.1 本地专用客户端(JavaFX/Swing/控制台等)
- 每个用户必须安装一个你提供的 Java 程序(jar/exe)。
- 程序里用 Netty 的 SocketChannel / WebSocket 直接连到聊天服务器,通信协议可以自定义(纯 TCP、protobuf、JSON 都行)。
- 优点:性能好、功能丰富、可离线推送、可做桌面通知。
- 缺点:需要安装、升级成本高、跨平台打包麻烦。
1.1.2 纯 Web 前端(浏览器即可)
- 用户只要打开一个网址,前端 HTML/JS 通过 WebSocket(或 HTTP 轮询)与 Netty 服务器通信。
- Netty 里加 WebSocketServerProtocolHandler 就能直接处理浏览器发来的 WebSocket 帧。
- 优点:零安装、跨平台、更新即刷页面。
- 缺点:浏览器能力受限(文件、通知、剪贴板等)。
简单而言,这二者的实现就像是本地QQ和网页QQ,前者需要安装配置环境,后者则只需要打开浏览器访问网址即可。
1.2 图示
二、 原理
维度 | JavaFX 客户端(基于 Netty 的 TCP 通信) | HTTP 前端(基于 HTTP 协议) |
通信协议 | 基于TCP 协议(底层是 Netty 封装的 TCP 长连接),可自定义应用层协议(如直接传输字符串)。 | 基于HTTP 协议(应用层协议,底层也是 TCP,但协议规则完全不同)。 |
连接模式 | 长连接:客户端与服务端建立连接后保持连接状态(除非主动断开),可双向实时通信。 | 传统 HTTP 是短连接(请求 - 响应后断开);若需实时通信需用 WebSocket(基于 HTTP 的长连接升级)。 |
数据交互方式 | 客户端与服务端可双向主动发送数据(如客户端随时发消息,服务端随时推送广播)。 | 传统 HTTP:客户端主动请求→服务端被动响应(服务端不能主动给客户端发数据); WebSocket 支持双向主动发送。 |
数据格式 | 可自定义(如字符串、二进制、JSON 等,由 Netty 编解码器处理)。 | HTTP 规定数据格式(请求头、响应头、Body,Body 可放 JSON / 表单等,需符合 HTTP 规范)。 |
底层框架依赖 | 依赖 Netty(封装 TCP 通信)+ JavaFX(UI 渲染)。 | 依赖浏览器(解析 HTML/JS)+ HTTP 服务器(如 Tomcat)+ 后端框架(如 Spring MVC)。 |
三、 实现框架
根据这两个实现原理也可得知,实现这两种方案所需要的项目框架是不一样的。
前者用基础的 Maven 结构即可,后者通常需要 MVC(或类似分层架构)。这本质上是由它们的通信模式和功能职责决定的。
方案 | 核心需求 | 所需框架 / 结构 | 为什么需要这样的框架? |
JavaFX+Netty 客户端 | 1. 桌面 UI 渲染(JavaFX) 2. TCP 长连接通信(Netty) 3. 简单消息收发逻辑 | 基础 Maven 结构即可 : - 引入 Netty、JavaFX 依赖 - 无需复杂分层,按功能划分类(如 Client、Handler、UI) | 功能单一:主要是 “连接服务器 + 收发消息 + 显示 UI”,逻辑线性(用户操作→调用 Netty 发送→接收消息→更新 UI),无需处理 HTTP 请求、路由、页面跳转等复杂逻辑。 |
Web 前端 + 服务端 | 1. 网页 UI 渲染(HTML/JS) 2. HTTP 请求处理(接收前端页面请求) 3. WebSocket 长连接(实时聊天) 4. 可能需要路由、参数解析、页面跳转 | 至少需要 MVC 分层架构 : - 后端:用 Spring MVC(或 Netty+HTTP 处理器) - 前端:HTML/JS(或 Vue/React) - 需划分控制层(接收请求)、服务层(处理业务)、视图层(返回页面) | 功能复杂:要处理 “用户访问网页→返回 HTML”“解析 HTTP 参数”“WebSocket 握手”“消息广播” 等多环节,需分层解耦(MVC 将 “接收请求”“处理逻辑”“返回页面” 分开),否则代码会混乱。 |
四、 是否连接数据库?
这两个聊天室项目本质上不强制需要连接数据库,但是否需要数据库取决于你的功能需求 —— 数据库的核心作用是 “持久化存储数据”,如果你的聊天室不需要保存历史消息、用户信息等,完全可以不用数据库;如果需要这些功能,则必须引入数据库。
而现在就是在实现一个简单的聊天逻辑,所以不需要连接数据库。
五、代码附上(以JavaFX+Netty为例)
参见文章顶部。