You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot 4创建WebSocket服务器的方法及客户端断开异常问题

Godot WebSocket服务器创建与多客户端断开问题解决方案

一、当前创建WebSocket服务器的正确方法

你遇到的WebSocketServer找不到的问题,大概率是版本文档差异导致的:

  • 在Godot 3.x中,WebSocketServer是直接可用的核心类,可直接实例化使用。
  • 在Godot 4.x中,该类依然存在(属于Networking模块,可能你搜索时遗漏了分类),标准实现流程如下:
  1. 初始化服务器并监听端口
var ws_server = WebSocketServer.new()

func _ready():
    # 监听自定义端口,示例为8080
    var error = ws_server.listen(8080)
    if error != OK:
        print("启动服务器失败: ", error)
        get_tree().quit()
  1. 帧循环中处理服务器事件
    在_process或_physics_process中轮询服务器,处理新连接、数据包和断开事件:
func _process(delta):
    # 轮询服务器状态
    ws_server.poll()

    # 处理新连接
    while ws_server.get_connection_count() > 0:
        var peer = ws_server.get_connection()
        print("新客户端连接: ", peer.get_peer_id())
        # 可选:设置消息模式为文本或二进制
        peer.set_mode(WebSocketPeer.MODE_TEXT)

    # 处理客户端消息
    for peer in ws_server.get_peers():
        peer.poll()
        while peer.get_ready_state() == WebSocketPeer.STATE_OPEN:
            var packet = peer.get_packet()
            if packet:
                print("收到客户端 ", peer.get_peer_id(), " 的消息: ", packet.get_string_from_utf8())
                # 示例:广播消息给所有客户端
                for p in ws_server.get_peers():
                    p.send_packet(packet)

    # 处理断开的客户端
    var closed_peers = ws_server.get_closed_peers()
    for peer_id in closed_peers:
        print("客户端 ", peer_id, " 断开连接")
  1. 关闭服务器
    在场景退出时停止服务器:
func _exit_tree():
    ws_server.stop()

二、多客户端断开时self.stop_scheduled意外执行的解决方案

这个问题通常是停止逻辑的触发条件错误导致的,修复方式如下:

核心问题点

示例代码默认适配单客户端场景,断开时直接触发服务器停止,未考虑多客户端的情况;或者停止逻辑被错误绑定到单个客户端的断开事件。

修复步骤

  1. 修正停止触发条件
    确保只有当服务器的连接数为0(所有客户端都断开)时,才设置self.stop_scheduled为true:
# 处理断开事件后添加判断
var closed_peers = ws_server.get_closed_peers()
for peer_id in closed_peers:
    print("客户端 ", peer_id, " 断开连接")

# 仅当无客户端连接时才触发停止
if ws_server.get_connection_count() == 0:
    self.stop_scheduled = true
  1. 排查误触发点
  • 检查是否在closed_peers的遍历循环内设置了self.stop_scheduled,这会导致单个客户端断开就触发停止。
  • 确认没有其他代码路径(如特定消息处理)意外修改了stop_scheduled的值。
  1. 添加日志验证逻辑
    在关键节点添加日志,确认连接数和断开事件的对应关系,辅助定位问题:
print("当前在线客户端数量: ", ws_server.get_connection_count())

内容的提问来源于stack exchange,提问作者Hydroper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:07:47