WebSocketSharp 基礎語法:連線、架設、訊息收發與伺服器廣播

2023.02.14 / Dev
WebSocketSharp 是一個 C# 版本的 WebSocket 程式庫,透過少許的語法就能輕易實作跨裝置、平台、軟體的資料傳輸功能。WebSocketSharp 除了能在一般的 C# 專案中使用

WebSocketSharp 是一個 C# 版本的 WebSocket 程式庫,透過少許的語法就能輕易實作跨裝置、平台、軟體的資料傳輸功能。WebSocketSharp 除了能在一般的 C# 專案中使用,也可用於 Unity 開發。

開發環境

於同一解決方案中建立兩個主控台應用程式專案,分別用於開發客戶端與伺服器。

作業系統Windows 10
開發軟體Visual Studio 2022
程式語言C#
框架版本.NET 6.0
專案類型主控台應用程式

安裝 NuGet 套件

開啟 工具 > NuGet 套件管理員 > 管理方案的 NuGet 套件 面板,搜尋 WebSocketSharp 套件並安裝。

伺服器架設

基礎語法

首先需建立伺服器處理邏輯運算用的行為類別 (CustomBehavior),繼承 WebSocketBehavior 後,覆寫 OnOpen 與 OnMessage 方法。

using WebSocketSharp;
using WebSocketSharp.Server;

namespace TEDLIOU.WebsocketSharp.Example.Server
{
    internal class CustomBehavior : WebSocketBehavior
    {
        protected override void OnOpen()
        {
            // TODO
        }

        protected override void OnMessage(MessageEventArgs e)
        {
            // TODO
        }
    }
}

實體化 WebSocketServer 後,建立路徑與定義其行為類別。

using WebSocketSharp.Server;

namespace TEDLIOU.WebsocketSharp.Example.Server
{
    internal class Program
    {
        static void Main(string[] _)
        {
            var port = 8080;
            var path = "/";
            var wssv = new WebSocketServer(port);
            wssv.AddWebSocketService<CustomBehavior>(path);
            wssv.Start();

            Console.ReadLine();
        }
    }
}

接收訊息

於 OnMessage 中讀取輸入的 MessageEventArgs 參數的 Data 即是收到的字串,或讀取 RawData 取得 Byte 陣列。

protected override void OnMessage(MessageEventArgs e)
{
    if (e.IsText)
        Console.WriteLine(e.Data);

    if (e.IsBinary)
        Console.WriteLine(e.RawData);
}

回應訊息

於 CustomBehavior 的 OnMessage 呼叫 Send 以送出回應訊息。需先接收後才能回應,適用於一對一溝通。

protected override void OnMessage(MessageEventArgs e)
{
    Send("Hello World!");
}

廣播訊息

於 CustomBehavior 的任意位置呼叫 Sessions.Broadcast 以送出廣播訊息。由伺服器主動推送至所有客戶端,適用於一對多溝通,例如:聊天室。

Sessions.Broadcast("Hello World!");

客戶端連線

基礎語法

ws://IP:Port/Path 格式的位址實體化 WebSocket 後,註冊 OnMessage 事件與啟動連線。

using WebSocketSharp;

namespace TEDLIOU.WebsocketSharp.Example.Client
{
    internal class Program
    {
        static void Main(string[] _)
        {
            var server = "127.0.0.1";
            var port = 8080;
            var path = "/";
            var ws = new WebSocket($"ws://{server}:{port}{path}");
            ws.OnMessage += OnMessage;
            ws.Connect();

            Console.ReadLine();
        }

        static void OnMessage(object? sender, MessageEventArgs e)
        {
            // TODO
        }
    }
}

發送訊息

在任何能存取 WebSocket 物件的位置呼叫 Send 方法即可送出訊息。

ws.Send("Hello World!");

接收訊息

於 OnMessage 中讀取 Data 或 RawData 以接收訊息,用法與伺服器的相同。

static void OnMessage(object? sender, MessageEventArgs e)
{
    if (e.IsText)
        Console.WriteLine(e.Data);

    if (e.IsBinary)
        Console.WriteLine(e.RawData);
}

WebSocketSharp 適用於需於 C# 中實作跨裝置、平台或軟體連線功能的專案,無論是本機、區域或網際網路連線,皆無須煩惱底層的封包傳輸問題,能有效節省開發成本。

相關文章

Ted Liou

雲科碩士在讀中,專注於 Unity C#、TouchDesigner 技術,常把技術筆記分享到部落格,偶爾還直接挪用文章來當教材的研究生。