# 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);
> }
> }
> ~~~
---