为何Unity WebGL构建无法读取UDP端口传入数据?
Unity WebGL无法接收UDP数据的问题解决
核心原因
WebGL运行在浏览器沙箱环境中,完全不支持.NET原生的Socket类(包括UdpClient)——你的代码在本地编辑器/EXE里能正常运行,是因为它们直接调用系统级网络接口,但浏览器出于安全限制,禁止网页直接访问系统级UDP/TCP端口,和CORS无关。
可行解决方案
方案1:改用WebSocket协议(推荐)
浏览器仅允许网页使用HTTP/HTTPS、WebSocket这类标准网络协议,因此需要把UDP通信逻辑替换为WebSocket:
- 原Python发送端:放弃UDP,改用WebSocket客户端向Unity WebGL发送数据
- Unity WebGL端:使用WebSocket客户端库(比如Unity自带的
WebSocket类,或第三方SocketIO库)接收数据
方案2:增加中转服务器(保留UDP发送逻辑)
如果必须保留原UDP发送流程,可以搭建一个轻量中转服务器做协议转换:
- 写一个中转服务器(比如Python的Flask+SocketIO),监听UDP端口接收原Python程序的数据
- 中转服务器将收到的UDP数据通过WebSocket推送给Unity WebGL端
- Unity WebGL端连接中转服务器的WebSocket端口接收数据
代码调整示例
原Python UDP发送代码(可保留,配合中转服务器使用)
senderSocket.sendto(str.encode(str(object)), serverAdressPort)
中转服务器示例(Python + Flask-SocketIO)
from flask import Flask from flask_socketio import SocketIO import socket import threading app = Flask(__name__) socketio = SocketIO(app, cors_allowed_origins="*") UDP_PORT = 7090 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_socket.bind(('', UDP_PORT)) def udp_listener(): while True: data, addr = udp_socket.recvfrom(1024) # 将UDP数据转发给WebSocket客户端 socketio.emit('udp_data', data.decode('utf-8')) if __name__ == '__main__': # 启动UDP监听线程 threading.Thread(target=udp_listener, daemon=True).start() # 启动WebSocket服务器 socketio.run(app, host='0.0.0.0', port=5000)
Unity WebGL端接收代码(使用SocketIO)
using UnityEngine; using SocketIOClient; public class WebSocketReceiver : MonoBehaviour { private SocketIOUnity socket; void Start() { var uri = new Uri("http://localhost:5000"); socket = new SocketIOUnity(uri); socket.OnConnected += () => { Debug.Log("WebSocket连接成功"); }; // 监听中转服务器推送的udp_data事件 socket.On("udp_data", (response) => { string data = response.GetValue<string>(); Debug.Log("收到数据:" + data); // 在这里处理数据逻辑 }); socket.Connect(); } void OnDestroy() { socket?.Disconnect(); } }
注意事项
- 部署WebGL到TomCat时,要确保中转服务器和WebGL应用的域名/端口符合浏览器跨域规则(或在中转服务器配置CORS)
- Unity WebGL构建时,需确认导入的WebSocket/SocketIO库支持WebGL平台
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

