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

使用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.xdnf.cn/news/16422.html

相关文章:

  • VS Code + LaTeX 绘制电气图完全指南(含 PlantUML 样式参考)
  • 2025年全国青少年信息素养大赛Scratch算法创意实践挑战赛 小低组 初赛 真题
  • Javaweb————HTTP消息体拆分讲解
  • 【嵌入式电机控制#20】无刷直流电机硬件案例
  • 【数据结构】栈和队列的实现
  • 单片机ADC机理层面详细分析(一)
  • Anaconda常用命令及环境管理指南
  • Redis的下载和安装(Linux)
  • 无源域自适应综合研究【3】
  • Java模块化编程深度指南:从过程式到面向对象的进化之路
  • vulhub Web Machine(N7)靶场攻略
  • 使用 Google Earth 的 DEM — 教程。
  • SpringMVC相关基础知识
  • selenium自动化鼠标和键盘操作
  • 【工程化】浅谈前端构建工具
  • 基于POD和DMD的压气机叶片瞬态流场分析与神经网络预测
  • 【GaussDB】如何从GaussDB发布包中提取出内核二进制文件
  • 嵌入式分享#27:原来GT911有两个I2C地址(全志T527)
  • 【Vue2】结合chrome与element-ui的网页端条码打印
  • matplotlib库 点线图,直方图,多子图与三维空间的可视化
  • 从0到1学Pandas(六):Pandas 与数据库交互
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-33,(知识点:二极管结温,热阻,二极管功耗计算)
  • golang实现一个规则引擎,功能包括实时增加、修改、删除规则
  • Jenkins持续集成工具
  • ACO-OFDM 的**频带利用率**(单位:bit/s/Hz)计算公式
  • Unity GenericMenu 类详解
  • 酒店智能门锁SDK新V门锁系统接口函数[2025版]Delphi 7.0——东方仙盟硬件接口库
  • 学习游戏制作记录(剑投掷技能)7.26
  • 中文语音识别与偏误检测系统开发
  • Java基础-文件操作