# Web 联网

> How to use networking in Web.

您可以按照以下方式在 Web 中使用联网功能：

* 使用 [UnityWebRequest](/engine/6000.0/manual/scripting/object-oriented-development/web-request.md) 类。
* [使用 Unity Netcode 联网包](#UsingNetcode)。

## 在 Web 中使用 UnityWebRequest 类##use-the-unitywebrequest-class-in-web

Unity 支持在 Web 中使用 [UnityWebRequest](/engine/6000.0/script-reference/unity-engine-networking/unity-web-request.md) 类。为实现 UnityWebRequest 类，Unity 使用 JavaScript Fetch API，它使用浏览器来处理 web 请求。这种情况下对访问跨域资源施加了安全限制。

如果您向非 Unity 内容托管服务器发送 Web 请求，则发送请求的服务器必须授权 Unity 内容。

为了在 Web 中访问跨域 Web 资源，您尝试访问的服务器需要使用[跨源资源共享 (CORS)](https://fetch.spec.whatwg.org/#http-cors-protocol) 对跨域 Web 资源进行授权。

如果您尝试使用 UnityWebRequest 来访问内容，但远程服务器未正确设置或配置 CORS，浏览器控制台中将显示如下错误：

```
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://myserver.com/. This can be fixed by moving the resource to the same domain or enabling CORS.
```

服务器需要向发出的 http 响应中添加一些 Access-Control 标头，以指示哪些网页有权从 Web 浏览器读取该信息。

请参阅以下示例，该示例演示了如何添加 Access-Control 标头，以允许 Unity Web 从任何源点访问 Web 服务器上的资源。该示例包括常见的请求标头，并允许 GET、POST 或 OPTIONS 方法：

```
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Headers": "Accept, X-Access-Token, X-Application-Name, X-Request-Sent-Time",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Origin": "*",
```

### **UnityWebRequest 下载**##**unitywebrequest-downloads**

不要使用阻止 UnityWebRequest 下载的代码，比如下方所示：

```
while(!www.isDone) {}
```

Web 浏览器不允许同步阻止代码执行以等待网络传输。因此，如果需要执行同步样式 UnityWebRequest，请使用[协同程序](/engine/6000.0/manual/scripting/object-oriented-development/coroutines.md)和 yield 语句等待下载完成。有关更多信息，请参阅[使用 UnityWebRequest 的协同程序示例](/engine/6000.0/manual/scripting/object-oriented-development/web-request/hlapi.md)。

## 使用 Unity Netcode 联网包##use-the-unity-netcode-networking-packagescrollpoint-id=usingnetcode-/

由于安全限制，Web 浏览器不允许直接访问 TCP 或 UDP 套接字。相反，您可以使用支持 Web 平台的 Unity Netcode 联网包。有关更多信息，请参阅[关于 Netcode for GameObjects](https://docs-multiplayer.unity3d.com/netcode/current/about/)（Unity 多人游戏联网）文档。

有关 Web 浏览器联网标准的更多信息，您可能希望探索以下内容：

* [WebSocket 协议](https://datatracker.ietf.org/doc/html/rfc6455) (Datatracker)
* [WebRTC：浏览器中的实时通信](https://www.w3.org/TR/webrtc/) (W3)
* [WebTransport](https://www.w3.org/TR/webtransport/) (W3)。

## Web 联网的限制##limitations-of-web-networking

有一些联网功能是 Web 平台不支持的。

### 不支持 .NET 联网类##no-support-for-.net-networking-classes

无法在 Web 平台中使用任何 .NET 联网类，因为 JavaScript 代码无法直接访问互联网协议 (IP) 套接字来实现网络连接。具体而言，Web 不支持 `System.Net` 命名空间中的任何 .NET 类。

### 不支持原生套接字访问##no-support-for-native-socket-access

由于浏览器内的安全限制，Web 平台不支持原生套接字访问。因此，Web 也不支持 [UnityEngine.Ping](/engine/6000.0/script-reference/unity-engine/ping.md) (ICMP) 等功能。
