Godot 4创建WebSocket服务器的方法及客户端断开异常问题
Godot WebSocket服务器创建与多客户端断开问题解决方案
一、当前创建WebSocket服务器的正确方法
你遇到的WebSocketServer找不到的问题,大概率是版本文档差异导致的:
- 在Godot 3.x中,
WebSocketServer是直接可用的核心类,可直接实例化使用。 - 在Godot 4.x中,该类依然存在(属于
Networking模块,可能你搜索时遗漏了分类),标准实现流程如下:
- 初始化服务器并监听端口
var ws_server = WebSocketServer.new() func _ready(): # 监听自定义端口,示例为8080 var error = ws_server.listen(8080) if error != OK: print("启动服务器失败: ", error) get_tree().quit()
- 帧循环中处理服务器事件
在_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, " 断开连接")
- 关闭服务器
在场景退出时停止服务器:
func _exit_tree(): ws_server.stop()
二、多客户端断开时self.stop_scheduled意外执行的解决方案
这个问题通常是停止逻辑的触发条件错误导致的,修复方式如下:
核心问题点
示例代码默认适配单客户端场景,断开时直接触发服务器停止,未考虑多客户端的情况;或者停止逻辑被错误绑定到单个客户端的断开事件。
修复步骤
- 修正停止触发条件
确保只有当服务器的连接数为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
- 排查误触发点
- 检查是否在
closed_peers的遍历循环内设置了self.stop_scheduled,这会导致单个客户端断开就触发停止。 - 确认没有其他代码路径(如特定消息处理)意外修改了
stop_scheduled的值。
- 添加日志验证逻辑
在关键节点添加日志,确认连接数和断开事件的对应关系,辅助定位问题:
print("当前在线客户端数量: ", ws_server.get_connection_count())
内容的提问来源于stack exchange,提问作者Hydroper
相关产品推荐
相关产品推荐

