当前位置: 首页 > news >正文

使用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为例)

参见文章顶部。

http://www.lryc.cn/news/600723.html

相关文章:

  • Java面试题及详细答案120道之(041-060)
  • 图片查重从设计到实现(5)Milvus可视化工具
  • 力扣872. 叶子相似的树
  • 如何在 Ubuntu 24.04 或 22.04 中创建自定义 Bash 命令
  • Sklearn 机器学习 数值指标 entropy熵函数
  • 认识泛型、泛型类和泛型接口
  • 好的编程语言设计是用简洁清晰的原语组合复杂功能
  • 消息缓存系统
  • JavaEE初阶第十一期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(九)
  • 《计算机组成原理与汇编语言程序设计》实验报告二 基本数字逻辑及汉字显示
  • 告别配置混乱!Spring Boot 中 Properties 与 YAML 的深度解析与最佳实践
  • 非定长滑动窗口(持续更新)
  • Netty中AbstractChannelHandlerContext源码分析
  • C++连接MySQL完整教程
  • easy-llm-cli的安装和使用
  • Ubuntu安装node-red
  • 广东省省考备考(第五十七天7.26)——数量、言语(强化训练)
  • 【CTF-PWN】【攻防世界题目pwnstack】python攻击脚本ret(checksec、pwngdb、IDA)(含“/bin/sh“)
  • Traffic Lights set的使用
  • AI Agent开发学习系列 - langchain之LCEL(5):如何创建一个Agent?
  • Ansible列出常见操作系统的发行版,Ansible中使用facts变量的两种方式
  • 定义域第一题
  • InfluxDB Flux 查询协议实战应用(二)
  • 修改site-packages位置与pip配置
  • 网络:应用层
  • docker安装问题汇总
  • 一文速通《多元函数微分学》
  • AI Agent开发学习系列 - langchain之LCEL(4):Memory
  • x86汇编语言入门基础(三)汇编指令篇5 串操作
  • 【架构】Docker简单认知构建