LAN Chat System 局域网全平台实时通信系统

开源项目详解:LAN Chat System 局域网全平台实时通信系统

大家好,我是夏木。今天给大家带来我最新开源的项目——LAN Chat System 局域网通信系统。这是一套专为局域网环境打造的、开箱即用的全平台实时通信解决方案,彻底解决了内网环境下跨设备消息互通、文件传输的痛点,无需公网服务器、无需复杂配置,一键部署即可实现多终端互联互通。本文将从项目初衷、系统架构、技术选型、功能实现、部署教程等多个维度,为大家完整拆解这个项目。

一、项目开发背景与核心解决的痛点

在日常办公、家庭内网、机房运维、展会现场等无公网/公网受限的场景中,我们经常会遇到这些问题:

  • 手机和电脑互传文件,需要借助微信、QQ等公网工具,不仅限速严重,还会消耗流量,大文件传输体验极差
  • 内网多设备之间的临时消息沟通,没有轻量化的工具,需要搭建复杂的企业通信系统
  • 涉密/内网环境不允许数据上公网,传统通信工具无法使用
  • 现有局域网工具大多仅支持单平台,无法实现Android、Windows、macOS、Linux多端互通

基于以上痛点,我开发了这套LAN Chat System,它完全运行在局域网内,数据全程不经过公网,兼顾了安全性、易用性和跨平台兼容性,同时做到了轻量化部署,零基础也能快速上手。

二、系统核心功能特性

本项目覆盖了局域网通信的全场景需求,核心功能如下:

  • 实时双向消息通信:基于WebSocket的低延迟消息收发,支持文本消息实时推送,附带精准时间戳与发送者信息,全端消息实时同步
  • 全类型文件传输能力:支持任意格式、任意大小的文件上传与下载,图片、视频、文档、压缩包均可完美支持;图片类文件支持在线预览,无需下载即可查看
  • 局域网自动服务器发现:移动端无需手动输入服务器IP地址,APP启动后自动扫描局域网内的可用服务节点,一键完成连接,零基础用户也能快速上手
  • 统一化用户头像系统:由服务端集中管理用户头像资源,支持用户自主更换头像,更换后全平台实时同步,所有客户端显示一致的头像信息
  • 在线用户实时管理:实时展示当前在线的所有用户列表与在线人数,用户上下线实时广播通知,基于IP地址实现用户身份唯一识别
  • 微信风格现代化UI:Web端与移动端均采用了用户熟悉的IM类软件交互逻辑,UI设计贴合主流使用习惯,无需学习成本即可快速上手
  • 多终端全平台兼容:一套服务端,同时支持Web浏览器、Android移动端两大客户端,Windows、macOS、Linux设备可直接通过浏览器接入,无需安装额外软件

三、系统架构与数据流设计

本系统采用经典的中心化C/S(客户端-服务端)架构,所有节点均处于同一局域网内,通过WiFi/有线网络完成数据交互,无任何公网依赖,整体架构如下:

┌─────────────────────────────────────────────────────────────────────┐
│                      局域网通信系统 整体架构                          │
├─────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  ┌────────────────┐       ┌────────────────┐       ┌──────────────┐ │
│  │  PC Web 客户端  │       │  Node.js 服务端  │       │  移动端APP   │ │
│  │  (浏览器原生)   │◄────►│  消息/文件中枢   │◄────►│  (Flutter)   │ │
│  └────────────────┘       └────────────────┘       └──────────────┘ │
│          │                        │                        │         │
│          └────────────────────────┼────────────────────────┘         │
│                           局域网WiFi/有线网络                          │
└─────────────────────────────────────────────────────────────────────┘

3.1 核心数据流设计

  • 消息通信流:客户端通过Socket.io与服务端建立长连接,发送消息时将消息体+发送者信息+时间戳推送到服务端,服务端校验后通过广播机制推送给所有在线客户端,实现全端消息同步
  • 文件传输流:客户端通过HTTP POST协议将文件分片上传至服务端,服务端通过Multer中间件完成文件接收、存储、元信息记录,生成唯一可访问的下载链接,再通过消息广播将文件信息推送给所有客户端
  • 用户状态流:客户端连接/断开时,服务端自动触发上下线事件,更新在线用户列表,并将最新的用户状态广播给所有在线节点,实现用户在线状态的实时同步
  • 服务发现流:服务端启动后,通过UDP广播在局域网内周期性发布自身的IP地址与端口信息;移动端APP启动后,监听对应端口的广播包,自动解析服务端地址,完成自动连接,无需用户手动输入IP

四、全栈技术选型与实现细节

本项目在技术选型上,兼顾了开发效率、运行性能、跨平台兼容性与轻量化部署要求,全栈技术栈与实现细节如下:

4.1 服务端技术栈

服务端基于Node.js生态开发,核心目标是轻量化、高并发、易部署,单文件即可完成核心服务的启动,具体技术选型如下:

技术框架/库版本要求核心作用与实现细节
Node.jsv16.0 及以上服务端运行时,基于事件驱动的非阻塞I/O模型,完美适配WebSocket长连接场景,单进程即可支撑数百个客户端同时在线
Express最新稳定版轻量级Web服务框架,负责HTTP服务搭建、静态资源托管、文件上传接口、RESTful API开发,代码极简,性能优异
Socket.io最新稳定版核心双向通信库,基于WebSocket封装,兼容低版本HTTP协议,自带断线重连、房间广播、消息确认机制,是实现实时消息的核心
Multer最新稳定版Express生态的文件上传中间件,负责处理客户端的multipart/form-data文件请求,支持文件大小限制、扩展名过滤、自定义存储路径、文件名重命名防冲突
CORS最新稳定版跨域资源共享中间件,解决Web端、移动端与服务端的跨域请求问题,适配不同终端的访问需求
Node-os-utils最新稳定版系统信息获取库,用于获取服务端所在设备的局域网IP地址,实现服务启动时的IP自动展示与广播

服务端核心实现亮点

  • 单入口文件设计,核心逻辑全部集成在server.js中,无需数据库,无复杂配置,开箱即用
  • 文件自动归档机制,上传的文件按日期自动分类存储在uploads目录,便于管理与清理
  • 内置静态资源托管,Web前端代码全部托管在服务端的public目录,服务启动后即可通过浏览器直接访问
  • 头像资源统一管理,内置默认头像库,用户更换的头像统一存储在xo目录,全端同步访问
  • 基于IP的用户身份识别,无需注册登录,同一局域网内的设备通过IP地址即可完成身份标识,自动分配唯一用户名

4.2 移动端技术栈

移动端基于Google Flutter跨平台框架开发,一套代码即可编译生成Android APK,未来可快速适配iOS平台,核心技术选型如下:

技术框架/库核心作用与实现细节
Flutter SDK跨平台UI开发框架,采用Dart语言,自带渲染引擎,保证Android全版本的UI一致性,性能接近原生应用
Socket.io Client DartDart版Socket.io客户端,与服务端Socket.io完美兼容,实现与服务端的长连接建立、消息收发、断线重连
ProviderFlutter官方推荐的状态管理库,轻量级、易上手,实现全局用户状态、消息列表、在线用户列表的状态管理与UI响应式更新
Cached Network Image网络图片缓存库,实现头像、图片消息的本地缓存,减少重复网络请求,提升图片加载速度,节省局域网带宽
Flutter AnimateFlutter动画库,为消息收发、页面切换、状态变化提供流畅的动画效果,提升用户交互体验
Permission Handler权限管理库,适配Android不同版本的权限申请机制,统一处理网络、存储、WiFi状态等必要权限的申请与校验
Network Info Plus网络信息获取库,用于获取手机当前连接的局域网网段,实现服务端地址的自动扫描与发现
File Picker文件选择库,适配Android全版本的文件系统,实现任意类型文件的选择与上传

移动端核心实现亮点

  • 全自动服务发现,无需手动输入IP地址,APP启动后自动扫描局域网内的可用服务,一键连接
  • 微信风格的聊天界面,包含消息列表、输入框、图片预览、文件下载等完整功能,贴合用户使用习惯
  • 断线自动重连机制,网络切换、锁屏唤醒后自动重新连接服务端,无需用户手动操作
  • 后台保活优化,针对Android系统做了后台保活适配,保证APP在后台时也能正常接收消息通知
  • 全文件类型支持,可选择手机内任意格式的文件进行上传,支持大文件分片上传,避免内存溢出

4.3 Web前端技术栈

Web前端采用原生Web技术开发,无任何前端框架依赖,极致轻量化,无需编译,直接通过浏览器即可运行,适配所有现代浏览器,核心技术如下:

技术核心作用与实现细节
HTML5页面结构搭建,语义化标签,适配移动端与PC端浏览器的响应式布局
CSS3页面样式与UI渲染,采用Flex弹性布局,实现全设备响应式适配,微信风格的UI设计,自带深色模式适配
原生JavaScript (ES6+)前端交互逻辑开发,无需Vue/React等框架,代码极简,加载速度极快,零依赖
Socket.io Client浏览器端Socket.io客户端,实现与服务端的长连接,完成消息收发、状态同步
Fetch API原生HTTP请求接口,实现文件上传、头像更换、文件下载等HTTP请求
FileReader API本地文件读取接口,实现图片选择后的本地预览,无需上传即可查看图片内容

Web前端核心实现亮点

  • 零依赖、零编译,服务端启动后,任意设备只要在同一局域网,通过浏览器访问IP+端口即可使用,无需安装任何软件
  • 全响应式设计,完美适配PC、平板、手机浏览器,不同尺寸设备均有优秀的显示效果
  • 图片在线预览,支持图片消息的放大查看、缩放、下载,无需额外的预览软件
  • 消息本地缓存,浏览器本地存储历史消息,刷新页面后不会丢失历史记录
  • 键盘快捷发送,PC端支持Enter键发送消息,Ctrl+Enter换行,贴合办公场景使用习惯

五、项目目录结构详解

项目整体采用模块化目录设计,服务端、移动端、Web前端完全分离,便于后续维护与二次开发,完整目录结构与作用说明如下:

lan-chat-system/
├── server/                 # 服务端核心目录(Node.js)
│   ├── server.js          # 服务端主入口文件,包含HTTP服务、Socket.io逻辑、文件上传接口全部核心代码
│   ├── package.json       # Node.js项目依赖配置文件,包含所有依赖库与启动脚本
│   ├── public/            # Web前端静态资源托管目录
│   │   ├── index.html     # Web前端主页面,聊天界面的完整HTML结构
│   │   ├── css/           # 样式文件目录,包含主样式、响应式样式、深色模式样式
│   │   └── js/            # 前端逻辑脚本目录,包含Socket.io通信、消息处理、文件上传等全部JS逻辑
│   ├── uploads/           # 文件上传目录,服务端自动生成,存储用户上传的所有文件,按日期分类
│   └── xo/                # 头像资源目录,存储系统默认头像与用户上传的自定义头像
│
├── mobile-app/            # 移动端应用目录(Flutter)
│   ├── lib/               # Flutter核心源码目录,90%以上的业务代码在此处
│   │   ├── main.dart      # 应用主入口文件,APP初始化、全局状态管理、路由配置
│   │   ├── models/        # 数据模型目录,定义消息模型、用户模型、文件模型等数据结构
│   │   ├── screens/       # 页面目录,包含聊天页面、连接页面、设置页面等全部UI页面
│   │   ├── services/      # 服务层目录,封装Socket.io通信、网络请求、文件操作、权限处理等核心逻辑
│   │   ├── theme/         # 主题目录,定义APP全局配色、字体、样式规范,实现主题统一管理
│   │   └── widgets/       # 组件目录,封装消息气泡、输入框、用户列表项、文件卡片等可复用UI组件
│   ├── android/           # Android原生配置目录,包含AndroidManifest.xml、应用图标、权限配置、原生代码
│   ├── ios/               # iOS原生配置目录(预留,后续可快速适配iOS平台)
│   └── pubspec.yaml       # Flutter项目配置文件,包含依赖库、应用名称、版本号、资源配置等
│
├── .gitignore             # Git忽略文件配置,排除node_modules、构建产物、临时文件等
├── LICENSE                # 项目开源许可证,采用MIT开源协议
└── README.md              # 项目说明文档,包含快速开始、功能介绍、部署教程等核心信息

六、完整部署与使用教程

6.1 服务端部署(Windows/Linux/macOS通用)

第一步:环境准备

首先在需要部署服务端的设备上安装Node.js环境,要求版本为v16.0及以上,下载地址:Node.js官方网站,安装完成后,在终端执行以下命令验证安装是否成功:

# 验证Node.js版本
node -v
# 验证npm版本
npm -v

第二步:下载项目源码

通过Git克隆项目源码,或者直接从Gitee仓库下载ZIP压缩包到本地:

# Git克隆项目
git clone https://gitee.com/xmosai/lan-chat-system.git
# 进入项目根目录
cd lan-chat-system

第三步:安装服务端依赖

进入服务端目录,执行npm命令安装所有依赖库:

# 进入服务端目录
cd server
# 安装项目依赖
npm install

第四步:启动服务端

依赖安装完成后,执行启动命令即可一键启动服务:

# 启动服务端
npm start

启动成功后,终端会显示服务运行信息,包括服务访问地址、局域网IP地址、端口号,同时会自动打开默认浏览器进入Web聊天界面。服务默认运行在3000端口,如需修改端口,可编辑server.js文件中的端口配置项:

// 服务端口配置,可修改为任意未被占用的端口
const port = 3000;

第五步:防火墙与网络配置

为了保证其他设备能正常访问服务,需要在部署服务端的设备上开放对应端口的防火墙权限:

  • Windows系统:在Windows Defender防火墙中,添加3000端口的入站规则,允许局域网访问
  • Linux系统:通过ufw/iptables开放3000端口,示例:sudo ufw allow 3000
  • macOS系统:在系统设置-网络-防火墙中,允许Node.js接收传入连接

6.2 客户端使用教程

Web端使用(Windows/macOS/Linux通用)

  • 确保设备与服务端处于同一局域网(连接同一个WiFi/同一个交换机)
  • 打开任意现代浏览器(Chrome、Edge、Firefox、Safari等)
  • 在地址栏输入服务端显示的局域网IP+端口号,例如:http://192.168.1.100:3000
  • 回车即可进入聊天界面,自动分配用户名,无需注册登录,直接开始使用

Android移动端使用

  • 从Gitee仓库的Releases页面下载最新的APK安装包,安装到Android手机中
  • 确保手机与服务端连接同一个WiFi,处于同一局域网
  • 打开APP,APP会自动扫描局域网内的可用服务,扫描到后点击即可连接
  • 若自动扫描失败,可在APP内手动输入服务端的IP地址与端口号,点击连接即可
  • 首次打开APP时,根据提示授予网络、存储、文件访问权限,保证功能正常使用

6.3 从源码构建移动端APK

如果你想基于源码自定义修改,自行构建APK,可按照以下步骤操作:

  • 安装Flutter SDK,要求版本3.0及以上,配置好Flutter环境变量与Android SDK
  • 进入项目的移动端目录:cd mobile-app
  • 执行命令安装Flutter依赖:flutter pub get
  • 执行构建命令,生成release版本APK:flutter build apk --release
  • 构建完成后,终端会显示APK文件的输出路径,安装到手机即可使用

七、常见问题与解决方案

  1. Q:服务端启动成功,其他设备无法访问?
    A:优先检查防火墙是否开放了对应端口,其次确认所有设备处于同一局域网,没有开启AP隔离、访客网络等限制局域网设备互通的功能。
  2. Q:移动端APP扫描不到服务端?
    A:确认手机与服务端在同一WiFi,关闭路由器的AP隔离;可尝试在APP中手动输入IP地址连接;检查服务端设备的防火墙是否拦截了UDP广播包。
  3. Q:文件上传失败,提示大小超限?
    A:服务端默认限制了单文件最大上传大小,可在server.js中修改Multer的配置,调整文件大小限制。
  4. Q:服务端启动提示端口被占用?
    A:修改server.js中的端口号,更换为未被占用的端口,或者关闭占用3000端口的其他程序。
  5. Q:Android 13+设备无法选择文件?
    A:在APP的系统权限设置中,开启存储与文件访问权限,Android 13及以上版本需要单独申请媒体文件与文件管理权限。

八、开源协议与项目地址

本项目采用 MIT 开源协议,你可以自由地使用、修改、分发本项目的代码,无论是个人非商用还是商业使用,均无额外限制,仅需保留原作者的版权声明即可。

项目已完整开源至Gitee,欢迎大家Star、Fork,也欢迎提交PR一起完善项目,如果你在使用过程中遇到问题,可在仓库的Issues中提交反馈,我会及时回复。

🔗 项目开源仓库地址:https://gitee.com/xmosai/lan-chat-system


作者:夏木 (XiaMu)
本文首发于我的个人网站,转载请注明出处与项目开源地址。

阅读剩余
THE END