備忘録

備忘録

C#でWebSocketサーバを建てる方法

Ⅰ. はじめに

タイトルの通り「C#でWebSocketサーバを建てる方法」です。

Ⅱ. やり方

1. 必要なパッケージをNuGetからインストールする
Install-Package Fleck
2. サンプルプログラムを書く
using Fleck;
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace WebSocketServerTest
{
  class Program
  {
    static void StartServer()
    {
      var server = new WebSocketServer("ws://127.0.0.1:8181");
      server.RestartAfterListenError = true;

      // Nagleアルゴリズムを無効化する場合はtrueを指定する
      server.ListenerSocket.NoDelay = true;

      server.Start(socket =>
      {
        socket.OnOpen = () => Console.WriteLine("Open!");
        socket.OnClose = () => Console.WriteLine("Close!");
        socket.OnMessage = message =>
        {
          // 文字列データ受信時
          socket.Send($"hello {message}");
        };
        socket.OnBinary = bytes =>
        {
          // バイナリデータ受信時
        };
      });
    }

    static async Task StartClient(string name)
    {
      var ws = new ClientWebSocket();
      await ws.ConnectAsync(new Uri("ws://127.0.0.1:8181"), CancellationToken.None);
      await ws.SendAsync(Encoding.UTF8.GetBytes(name), WebSocketMessageType.Text, true, CancellationToken.None);
      var buffer = new byte[128];
      await ws.ReceiveAsync(buffer, CancellationToken.None);
      Console.WriteLine(Encoding.UTF8.GetString(buffer));
      await ws.CloseAsync(WebSocketCloseStatus.Empty, null, CancellationToken.None);
    }

    static async Task Main(string[] args)
    {
      StartServer();
      await StartClient("tanaka");
    }
  }
}

実行結果

Open!
hello tanaka
Close!