HOME / 第 6 部分 · 数据与进阶开发 / 第 71 课
MODULE 6 · 数据与进阶开发

第 71 课 · WebSocket 实时通信

⏱ 预计时长 40 分钟📊 难度 进阶📚 模块 第 6 部分 · 数据与进阶开发

🎯 本课学习目标

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集成

  1. UI:消息列表 + LineEdit + 发送按钮
  2. 发送 → send_json 打包(name + text)
  3. 收到 → 解析显示在列表
  4. 用 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 服务器做实时聊天/同步。