HOME / 第 6 部分 · 数据与进阶开发 / 第 71 课
MODULE 6 · 数据与进阶开发
第 71 课 · WebSocket 实时通信
🎯 本课学习目标
- 理解 WebSocket 与 HTTP 区别
- 连接 WebSocket 服务器
- 实现实时聊天/同步
HTTP 一问一答,WebSocket 长连接实时双向通信——在线对战的基础。本课实现实时聊天。
📖 详细教学步骤
WebSocket 是什么?概念
- HTTP:请求-响应,断开
- WebSocket:建立长连接,双方随时互发消息(实时)
- 用途:在线聊天、多人同步、实时状态
客户端连接代码
WebSocketPeer 客户端:
GDSCRIPTextends Node
var socket: WebSocketPeer = WebSocketPeer.new()
var connected: bool = false
func connect_to_server(url: String):
var error = socket.connect_to_url(url)
if error != OK:
print("连接失败:", error)
func _process(delta):
socket.poll() # 必须每帧轮询
if socket.get_ready_state() == WebSocketPeer.STATE_OPEN:
if not connected:
connected = true
print("连接成功!")
# 收消息
while socket.get_available_packet_count() > 0:
var msg = socket.get_packet().get_string_from_utf8()
print("收到:", msg)
elif socket.get_ready_state() == WebSocketPeer.STATE_CLOSED:
print("连接关闭")
发送消息代码
发送文本:
GDSCRIPTfunc send_message(text: String):
if socket.get_ready_state() == WebSocketPeer.STATE_OPEN:
socket.send_text(text)
func send_json(data: Dictionary):
send_message(JSON.stringify(data))
搭建测试服务器(Python)实操
本地测试用 Python 起一个 WebSocket 服务器:
GDSCRIPT# server.py(需要 pip install websockets)
import asyncio, websockets
async def handler(ws, path):
async for msg in ws:
print("收到:", msg)
await ws.send("服务器回应: " + msg)
async def main():
async with websockets.serve(handler, "localhost", 8080):
await asyncio.Future()
asyncio.run(main())
连接测试服务器代码
Godot 客户端连接本地服务器:
GDSCRIPTfunc _ready():
connect_to_server("ws://localhost:8080")
# 2 秒后发一条消息
await get_tree().create_timer(2.0).timeout
send_message("你好服务器!")
实时聊天 UI集成
- UI:消息列表 + LineEdit + 发送按钮
- 发送 → send_json 打包(name + text)
- 收到 → 解析显示在列表
- 用 VBoxContainer 动态添加 Label
💡 服务器转发所有客户端消息即可实现群聊。
⚠️
连接一直连不上?
确认服务器在跑、地址端口正确(ws:// 不是 http://)、每帧 poll()。
⚠️
消息没收到?
收到消息要循环 get_available_packet_count 读全部,别只读一次。
🧪 动手试一试
🏋️ 课后练习
用 Python 搭一个回显服务器,Godot 客户端连接后每 1 秒发一条递增消息,并显示服务器回应。
send_text + 收到循环打印;服务器 echo。
💡
客户端消息统一用 JSON 格式,便于扩展字段。
💡
生产环境用 wss://(加密版)。
🎓 本课小结
WebSocketPeer 建立长连接:connect_to_url + 每帧 poll() + send_text 发送 + 循环收包;配合 Python 服务器做实时聊天/同步。