HOWTO · Csharp

C# の WebSocket クライアント

このガイドでは、C# WebSocket とは何か、および C# で接続を確立する方法について説明します。 そして最後に、この記事では C# での WebSocket クライアントとその作成方法に取り組みます。

このガイドでは、C# WebSocket とは何か、および C# で接続を確立する方法について説明します。 そして最後に、この記事では C# での WebSocket クライアントとその作成方法に取り組みます。

それでは、これ以上遅れることなく、飛び込みましょう。

C# の WebSocket

WebSocket の概念を正しく理解するには、ネットワーク分野を調べる必要があります。 現在、WebSocket は、TCP 接続を使用して通信に全二重接続を提供する通信プロトコルです。

TCP は、サーバー間の通信を可能にするため、サーバー間の接続を可能にします。 これは全二重通信であるため、サーバー間の通信をやり取りする機会も提供します。

WebSocket プロトコルにより、Web ブラウザーは Web サーバーと対話できます。 半二重通信である HTTP などの他のプロトコルとは異なり、WebSocket を使用すると、サーバーとクライアントは完全に中断することなく双方向通信を行うことができます。

サーバーがコンテンツを送信するため、クライアントはコンテンツを要求する必要がなく、通信が容易になります。

これにより、メッセージのストリームも有効になります。 WebSocket は、TCP 経由でストリーミングされるこれらのメッセージを有効にして、独自のメッセージの概念を持たないバイト ストリームを処理できるようにします。

接続を確立する (ハンドシェイク)

サーバーとクライアントの間の接続は TCP を介して確立され、TCP はハンドシェイクの概念を使用します。 これは、クライアントがサーバーへの接続を形成する許可を要求し、サーバーがこの接続を形成するかどうかを決定することを意味します。

接続が確立されると、クライアントとサーバーは中断することなく通信できます。

TCP接続を使用

UDP と呼ばれる別の接続をご存知かもしれません。 ここで疑問が生じます: なぜ UDP ではなく TCP を使用するのでしょうか?

まず、UDP は TCP が提供する機能を提供しません。 信頼性も適切な接続もありません。

UDP を使用する唯一の利点は高速であることですが、この理由だけではこの接続を使用するには十分ではありません。 そのため、ハンドシェイク ルールにより信頼性の高い TCP を使用します。

C# で WebSocket クライアントを作成する

現在、.NET フレームワークは WebSocket をある程度サポートしています。 ただ、コードを最初から書くのは少し面倒なプロセスであり、非常にトリッキーです。 そのため、WebSocket 専用のライブラリ WebSocketSharp を使用します。

私たちのプログラミング経験をより簡単にするので、それは普及しています。 これを使用するには、ソフトウェアにダウンロードする必要があります。 推奨されるのは Visual Studio です。

このライブラリを使用して、サーバーとのクライアント側接続を作成する方法を見てみましょう。 この例では、接続するサーバーの URL を使用する必要があり、WebSocket 接続を作成しているため、常に ws で始まる必要があることに注意してください。

using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text;

namespace WebSocket_Client {
  public class Program {
    static void Main(string[] args) {
      // creating a client WebSocket
      WebSocket webSocket = new WebSocket(
          "ws://simple-websocket-server-echo.glich.me/");  // in this string, we will type URL of
                                                           // server we want to connect to

      webSocket.OnMessage += webSocket_OnMessage;  // message for the function below

      webSocket.Connect();                          // connection to server
      webSocket.Send("Hello server, i am client");  // message to server
    }

    public static void webSocket_OnMessage(object viewer,
                                           MessageEventArgs a)  // function for server to respond
    {
      Console.WriteLine("Recived from the server " + a.Data);
    }
  }
}

C# で破棄メソッドを使用して WebSocket クライアントを作成する

クライアント側のコードを記述する別の方法は、using() 関数を使用することです。 この関数を使用すると、この関数内に記述されたコードのブロックを破棄できます。

TCP 接続を使用しているため、この関数を使用することが重要です。 上で説明したように、TCP では、ハンドシェイク規則によって接続を確立して、接続を保護し、その信頼性を高めます。

ただし、確立された接続が適切に閉じられない場合があります。 これにより、接続を再度作成する際に問題が発生する可能性があります。これは、コンパイラの観点からは接続が閉じられていないためです。

このエラーのループから逃れるために、using() 関数を使用し、適切に実行して接続を破棄するコード ブロックを記述します。

using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text;

namespace WebSocket_Client {
  class Program {
    static void Main(string[] args) {
      using (WebSocket webSocket = new WebSocket(
                 "ws://simple-websocket-server-echo.glich.me/"))  // write the URL of server to
                                                                  // connect to
      {
        webSocket.OnMessage += webSocket_OnMessage;  // message for the function below

        webSocket.Connect();                          // connection to the server
        webSocket.Send("Hello server, i am client");  // sending a message to the server
      }
    }

    public static void webSocket_OnMessage(object viewer,
                                           MessageEventArgs a)  // function for server to respond
    {
      Console.WriteLine("Recived from the server " + a.Data);
    }
  }
}