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

为何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发送流程,可以搭建一个轻量中转服务器做协议转换:

  1. 写一个中转服务器(比如Python的Flask+SocketIO),监听UDP端口接收原Python程序的数据
  2. 中转服务器将收到的UDP数据通过WebSocket推送给Unity WebGL端
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:45:35