# Unity Websocket ###### tags: `交接資料` `unity` >author: NanoStar030、wcyan、JamesLai >last update: 2024/02/15 --- ## 一、C# .Net Websocket 介紹 .NET框架中,WebSocket是一種通訊協議,允許伺服器和客戶端之間實現雙向通訊。WebSocket提供了一個長期的連線,可以隨時傳輸數據,而不像傳統的HTTP請求需要在每次通訊時重新建立連接。 --- ## 二、基本架構 > ~~~ C# > using UnityEngine; > using System; > using System.Threading; > using System.Threading.Tasks; > using System.Net.WebSockets; # 使用.Net 內建的 Websocket > using System.Collections.Generic; > > public class SocketManager : MonoBehaviour > { > private ClientWebSocket websocket; > private void Start() > { > websocket = new ClientWebSocket(); > } > private async void OnDestroy() # Unity 程式結束時關閉 Websocket > { > await DisconnectSocketAsync(); > } > private async Task ConnectSocketAsync() # 連線至伺服器的程式 > { > if (websocket.State == WebSocketState.Open) return; > try > { > await websocket.ConnectAsync(new Uri("ws://172.0.0.1:3000", CancellationToken.None); > Debug.Log("Connected to " + "ws://172.0.0.1:3000"); > await ReceiveAsync(); # 接收到伺服器資料後的處理 > } > catch (Exception ex) > { > Debug.Log("Error: " + ex.Message); > } > } > private async Task DisconnectSocketAsync() # 斷開連線的程式 > { > if (websocket.State != WebSocketState.Open) return; > await websocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing connection", CancellationToken.None); > Debug.Log("Disconnected to " + "ws://172.0.0.1:3000"); > } > private async Task ReceiveAsync() # 處理接收資料 > { > byte[] buffer = new byte[1024]; > while (websocket.State == WebSocketState.Open) > { > WebSocketReceiveResult result = await websocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); > if (result.MessageType == WebSocketMessageType.Text) > { > string message = Encoding.UTF8.GetString(buffer, 0, result.Count); > Debug.log(message); > } > } > } > ~~~ --- ## 三、傳輸方法 1. 接受資料 > 和伺服器端相同,在傳輸的訊息前加上命令,讓用戶端在接收資料後,進行不同的資料處理 > ~~~ C# > private async Task ReceiveAsync() > { > byte[] buffer = new byte[1024]; > while (websocket.State == WebSocketState.Open) > { > WebSocketReceiveResult result = await websocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); > if (result.MessageType == WebSocketMessageType.Text) > { > string message = Encoding.UTF8.GetString(buffer, 0, result.Count); > string Command = message.Split(':')[0]; > string Value = message.Split(':')[1]; > if(Command == "Message") > { > Debug.Log(Value); > } > } > } > } > ~~~ 2. 傳送資料 > ~~~ C# > public async void SendStringAsync(string message) > { > try > { > byte[] buffer = Encoding.UTF8.GetBytes(message); > await websocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None); > } > catch (Exception ex) > { > Debug.LogError("Error sending message: " + ex.Message); > } > } > public async void SendBinaryAsync(byte[] binaryData) > { > try > { > await websocket.SendAsync(new ArraySegment<byte>(binaryData), WebSocketMessageType.Binary, true, CancellationToken.None); > } > catch (Exception ex) > { > Debug.LogError("Error sending Bytes Data" + ex.Message); > } > } > ~~~ ---