
很多人都遇到过这样的场景:
其实,只需要一个 Python 文件,就能搭建一个:
而且:
只要同一个 WiFi 即可。
聊天室具备:
例如:
http://192.168.1.23:8000
局域网其他设备打开即可进入聊天室。
这一部分适合:
的用户。
前往:
Python 官网
下载安装 Python 3。
安装时一定勾选:
Add Python to PATH
把聊天服务器代码保存为:
lan_chat_server.py
双击运行,或者命令行:
python lan_chat_server.py
看到:
局域网聊天室启动成功
本机访问:
http://127.0.0.1:8000
局域网访问:
http://192.168.1.23:8000
说明已经成功。
只需要:
连接同一个 WiFi。
然后浏览器打开:
http://192.168.1.23:8000
即可进入聊天室。
发送:
# 标题
**粗体**
```python
print("hello")
```
会自动渲染成富文本。
聊天室顶部会显示:
在线人数:5
打开页面自动上线。
关闭页面一段时间后自动离线。
每个昵称会自动获得不同颜色:
聊天时更容易区分消息来源。
整个系统实际上只有:
Python HTTP Server
+
HTML
+
CSS
+
JavaScript
没有使用:
因此非常轻量。
核心:
fromhttp.serverimportHTTPServer
fromhttp.serverimportBaseHTTPRequestHandler
Python 标准库自带 HTTP 服务能力。
服务器:
server=HTTPServer(
('0.0.0.0', 8000),
ChatHandler
)
其中:
0.0.0.0
表示:
监听所有网卡。
因此局域网设备可以访问。
整个聊天室只有几个接口:
/ | |
/messages | |
/send | |
/online |
这是一个非常典型的:
REST 风格
轻量 API。
消息直接保存在内存:
messages= []
每条消息:
{
"name": "用户",
"text": "消息",
"time": "12:30:00",
"color": "#2196F3"
}
优点:
缺点:
不同用户不同颜色:
hashlib.md5(name.encode())
通过用户名 hash:
idx=int(h, 16) %len(colors)
实现:
这是一个很经典的小技巧。
服务器维护:
online_users= {}
结构:
{
"Alice": 最后活跃时间,
"Bob": 最后活跃时间
}
前端每隔 5 秒发送一次:
heartbeat
服务器清理超时用户:
ifnow-v>USER_TIMEOUT:
因此实现:
前端引入:
<scriptsrc="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
使用:
marked.parse(text)
把 Markdown 转成 HTML。
这里是安全关键。
代码:
constsafeText=escapeHtml(m.text);
constmarkdownHtml=marked.parse(safeText);
这样可以防止:
<script>alert(1)</script>
被直接执行。
否则聊天室会存在:
XSS 攻击
风险。
当前版本使用:
轮询
即:
setInterval(loadMessages,1000);
每秒请求一次。
优点:
缺点:
这个项目其实已经接近:
局域网 IM 系统
后续可以升级:
替代轮询:
客户端 ←→ 服务器
实时推送。
当前:
内存存储
升级后:
数据库存储
即可:
增加:
拖拽上传
即可变成:
局域网文件共享系统
支持:
结构升级:
rooms= {}
private_messages= {}
即可支持:
甚至可以接入:
OpenAI
实现:
它非常适合:
例如:
例如:
例如:
例如:
