.NET ヘルプ

Socket io .NET(開発者向けの動作方法)

公開済み 2024年9月29日
共有:

についてSocket.IOサーバーは、リアルタイムで双方向かつイベント駆動型の通信を促進する強力なライブラリとして機能します。 それは、チャットアプリケーション、ライブアップデート、共同プラットフォームなどのタスクのためにウェブアプリケーションで広く使用されています。 Socket.IOは通常JavaScriptと関連付けられていますが、クライアント側でC#と共に効果的に使用することもできます。 時々、クライアントはウェブブラウザであることがあります。 この記事では、C#環境でSocket.IOクライアントを設定し使用する方法を探ります。 基本的な例をいくつか見ていき、利点と潜在的な使用例で締めくくります。

Socket.IO接続を確立する方法

についてSocket.IO接続は、さまざまな低レベルのトランスポートで確立できます。

  • HTTPロングポーリング
  • ウェブソケット

    • ウェブトランスポート

    Socket io .NET(開発者向けの仕組み):図1 - クライアント-サーバー通信アプリケーション

Visual Studio 2022でコンソールプロジェクトを作成する

Visual Studio を開き、スタートウィンドウで新しいプロジェクトの作成を選択します。

Socket io .NET(開発者向け:仕組み):図2 - 新しいプロジェクトを作成するウィンドウを示すスクリーンショット。

Visual Studio 2022でコンソールアプリケーションを作成するには、Visual Studioを起動し、スタートウィンドウで「新しいプロジェクトの作成」を選択します。 「Console App」テンプレートを選択し、プロジェクトに名前と場所を設定して、.NET 6.0が選択されていることを確認してください。

Socket.IOとは何ですか?

Socket.IO、JavaScriptライブラリは、ウェブクライアントとサーバーがリアルタイムコミュニケーションを行うことを可能にします。 それは二つの部分で構成されています。

Socket IOのパーツ

  • クライアントサイドライブラリ: ブラウザで実行します。
  • サーバーサイドライブラリ:Node.js上で実行されます。

必要なパッケージをインストールする

.NET アプリケーションで Socket.IO を使用するにはビジュアルスタジオ互換性のあるサーバー実装が必要です。 そのような実装の一つに、.NET 用の SocketIoClientDotNet があります。これにより、C# アプリケーションから Socket.IO に接続する Socket IO クライアントを使用できます。

まず、必要なNuGetパッケージをインストールします。 パッケージマネージャーコンソールを介して、またはプロジェクトファイルに参照を追加することによってこれを行うことができます。

Install-Package SocketIoClientDotNet
Install-Package SocketIoClientDotNet
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package SocketIoClientDotNet
VB   C#

SocketIoClientDotNetパッケージのスクリーンショット

Socket io .NET(開発者のための仕組み):図3 - NuGet パッケージ マネージャーの検索バーで「SocketIoClientDotNet」パッケージ名を検索して、解決策の NuGet パッケージの管理を使用して Socket.IO for NET をインストールし、プロジェクトを選択してインストール ボタンをクリックします。

このコマンドを実行すると、Socket.IOクライアントライブラリが.NETプロジェクトに組み込まれ、C#アプリケーションがSocket.IOサーバーに接続できるようになり、ユーザーとシステム間の通信を促進します。

Socket.IOの作成

C#クライアントに入る前に、Visual Studioで.NET Coreコンソールアプリを使用してSocket IOの基本的な例を設定しましょう。 これはクライアントの実装をテストするのに役立ちます。

サーバー実装の作成

以下のコードは、C#で書かれた基本的なSocket.IOサーバーを設定し、ポート3000でクライアントの接続を待ち受けます。クライアントがメッセージを送信すると、そのメッセージをログに記録し、受領を確認してクライアントに返信します。

using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Quobject.SocketIoClientDotNet.Client;
namespace DemoApp
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // Connect to the Socket.IO server
            var socket = IO.Socket("http://localhost:3000");
            // Listen for the "connect" event
            socket.On(Socket.EVENT_CONNECT, () =>
            {
                Console.WriteLine("Connected to the server!");
                // Emit a message to the server
                socket.Emit("message", "Hello from C# client!");
                // Listen for messages from the server
                socket.On("message", (data) =>
                {
                    Console.WriteLine("Message from server: " + data);
                });
            });
            // Listen for the "disconnect" event
            socket.On(Socket.EVENT_DISCONNECT, () =>
            {
                Console.WriteLine("Disconnected from the server!");
            });
            // Keep the console window open
            Console.ReadLine();
        }
    }
}
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Quobject.SocketIoClientDotNet.Client;
namespace DemoApp
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // Connect to the Socket.IO server
            var socket = IO.Socket("http://localhost:3000");
            // Listen for the "connect" event
            socket.On(Socket.EVENT_CONNECT, () =>
            {
                Console.WriteLine("Connected to the server!");
                // Emit a message to the server
                socket.Emit("message", "Hello from C# client!");
                // Listen for messages from the server
                socket.On("message", (data) =>
                {
                    Console.WriteLine("Message from server: " + data);
                });
            });
            // Listen for the "disconnect" event
            socket.On(Socket.EVENT_DISCONNECT, () =>
            {
                Console.WriteLine("Disconnected from the server!");
            });
            // Keep the console window open
            Console.ReadLine();
        }
    }
}
Imports System
Imports System.Net.WebSockets
Imports System.Text
Imports System.Threading
Imports System.Threading.Tasks
Imports Quobject.SocketIoClientDotNet.Client
Namespace DemoApp
	Friend Class Program
		Shared Sub Main(ByVal args() As String)
			' Connect to the Socket.IO server
			Dim socket = IO.Socket("http://localhost:3000")
			' Listen for the "connect" event
			socket.On(Socket.EVENT_CONNECT, Sub()
				Console.WriteLine("Connected to the server!")
				' Emit a message to the server
				socket.Emit("message", "Hello from C# client!")
				' Listen for messages from the server
				socket.On("message", Sub(data)
					Console.WriteLine("Message from server: " & data)
				End Sub)
			End Sub)
			' Listen for the "disconnect" event
			socket.On(Socket.EVENT_DISCONNECT, Sub()
				Console.WriteLine("Disconnected from the server!")
			End Sub)
			' Keep the console window open
			Console.ReadLine()
		End Sub
	End Class
End Namespace
VB   C#

コードの説明

スニペットでは、最初にIO.Socketを呼び出してSocket.IOクライアントインスタンス/送信者を作成します。("https://localhost:3000")クライアントマシンのポート3000で動作しているローカルサーバーに接続します

接続が成功すると(Socket.EVENT_CONNECT)サーバーに接続されていることを示すメッセージを印刷します。

次に、クライアントからサーバーにメッセージを送信するために、socket.Emitを使用します。(「メッセージ」、「C# クライアントからこんにちは」!"). これは「C#クライアントからこんにちは」という内容のメッセージを送信します。!"サーバーへ。

次に、socket.Onを使用して「message」イベントのコールバックを登録し、サーバーからのメッセージを待ちます。("メッセージ"(データ) => {... }). サーバーが「message」イベントを送信すると、コールバック関数が呼び出され、受信したメッセージがコンソールに表示されます。

クライアントからサーバーへの接続が切断された場合(Socket.EVENT_DISCONNECT)、切断を示すメッセージを印刷します。

最後に、Console.ReadLine()メソッドはコンソールウィンドウを開いたままにして、プログラムが実行後すぐに終了しないようにします。 これにより出力を確認することができ、プログラムが早期に終了しないことを保証します。

コードのスクリーンショット

ソケットio .NET(開発者向けの仕組み):図4 - サンプルコード

HTTPロングポーリング

ロングポーリングは、クライアント間でメッセージを送信するためにライブラリを使用するウェブ開発の技法です。(通常はウェブブラウザ)そしてサーバー。 サーバー上でイベントをトリガーし、クライアントが連続ポーリングすることなく受信できるようにすることで、リアルタイム通信を可能にします。 この方法は、チャットアプリケーションや株価ティッカーのように即時更新を必要とするアプリケーションに特に有用です。

Socket io .NET(開発者向けの仕組み):図5 - HTTP ロングポーリング

ウェブソケット

WebSocketは単一のTCP接続を介して双方向通信を容易にし、全二重通信チャネルを確立します。 このプロトコルは、クライアント(通常はウェブブラウザ)とサーバーとの間でリアルタイムの相互作用を可能にし、両者が非同期でメッセージを交換することを可能にします。

WebSocket通信の確立

クライアントはWebSocket接続を確立したいという意図を示して、サーバーにWebSocketハンドシェイクリクエストを送信します。 ハンドシェイクリクエストを受信すると、サーバーはWebSocketハンドシェイク応答で応答し、接続が正常に確立されたことを示します。 WebSocket接続を介して送信されるメッセージは、任意の形式で可能です。(例えば、テキストまたはバイナリ)非同期で送信および受信することができます。

ウェブトランスポート

Web Transportは、最先端のプロトコルとして、TCPやUDPのような従来のプロトコルの限界を超えてウェブコミュニケーションを強化するための追加機能を導入します。UDPとQUICを活用することにより、従来のプロトコルの欠点を克服し、よりユーザーフレンドリーで効率的です。 これにより、ユーザーにとって遅延が減少し、輻輳制御が向上し、最終的にはよりスムーズで応答性の高いウェブ体験を提供します。 さらに、Web Transportはより優れたセキュリティ対策を提供し、TCPと比較してより安全なデータ伝送を保証します。これらの進歩により、Web Transportはデータ転送の時間がかかる側面を軽減し、クライアントとサーバーの全体的なパフォーマンスを最適化します。

以下は、WebアプリケーションでWeb Transportを使用する基本的な例です。

using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SocketIO.Demo
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // The WebSocket URI
            string uri = "wss://echo.websocket.org";
            // Creating a new WebSocket connection
            using (ClientWebSocket webSocket = new ClientWebSocket())
            {
                await webSocket.ConnectAsync(new Uri(uri), CancellationToken.None);
                Console.WriteLine("Connected to the server");
                // Sending data over the WebSocket
                byte[] sendBuffer = new byte[] { 1, 2, 3, 4 };
                await webSocket.SendAsync(new ArraySegment<byte>(sendBuffer), WebSocketMessageType.Binary, true, CancellationToken.None);
                Console.WriteLine("Data sent to the server");
                // Receiving data from the WebSocket
                byte[] receiveBuffer = new byte[1024];
                WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
                byte[] data = new byte[result.Count];
                Array.Copy(receiveBuffer, data, result.Count);
                Console.WriteLine("Received data: " + BitConverter.ToString(data));
            }
        }
    }
}
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SocketIO.Demo
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // The WebSocket URI
            string uri = "wss://echo.websocket.org";
            // Creating a new WebSocket connection
            using (ClientWebSocket webSocket = new ClientWebSocket())
            {
                await webSocket.ConnectAsync(new Uri(uri), CancellationToken.None);
                Console.WriteLine("Connected to the server");
                // Sending data over the WebSocket
                byte[] sendBuffer = new byte[] { 1, 2, 3, 4 };
                await webSocket.SendAsync(new ArraySegment<byte>(sendBuffer), WebSocketMessageType.Binary, true, CancellationToken.None);
                Console.WriteLine("Data sent to the server");
                // Receiving data from the WebSocket
                byte[] receiveBuffer = new byte[1024];
                WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
                byte[] data = new byte[result.Count];
                Array.Copy(receiveBuffer, data, result.Count);
                Console.WriteLine("Received data: " + BitConverter.ToString(data));
            }
        }
    }
}
Imports System
Imports System.Net.WebSockets
Imports System.Text
Imports System.Threading
Imports System.Threading.Tasks
Namespace SocketIO.Demo
	Friend Class Program
		Shared Async Function Main(ByVal args() As String) As Task
			' The WebSocket URI
			Dim uri As String = "wss://echo.websocket.org"
			' Creating a new WebSocket connection
			Using webSocket As New ClientWebSocket()
				Await webSocket.ConnectAsync(New Uri(uri), CancellationToken.None)
				Console.WriteLine("Connected to the server")
				' Sending data over the WebSocket
				Dim sendBuffer() As Byte = { 1, 2, 3, 4 }
				Await webSocket.SendAsync(New ArraySegment(Of Byte)(sendBuffer), WebSocketMessageType.Binary, True, CancellationToken.None)
				Console.WriteLine("Data sent to the server")
				' Receiving data from the WebSocket
				Dim receiveBuffer(1023) As Byte
				Dim result As WebSocketReceiveResult = Await webSocket.ReceiveAsync(New ArraySegment(Of Byte)(receiveBuffer), CancellationToken.None)
				Dim data(result.Count - 1) As Byte
				Array.Copy(receiveBuffer, data, result.Count)
				Console.WriteLine("Received data: " & BitConverter.ToString(data))
			End Using
		End Function
	End Class
End Namespace
VB   C#

この例では、まず WebSocket URL を使用してサーバーに新しい WebTransport 接続を作成します。(wss://echo.websocket.org). 次に、接続上に双方向ストリームを作成して、データを送信します。([1, 2, 3, 4])ストリームを越えて。 最後に、ストリームからデータを読み取り、コンソールにログを記録します。

上記のコードの出力

WebSocketエコーサーバーでアプリケーションを実行すると、出力は次のようになります。

Socket io .NET(開発者向けの仕組み):図 6 - WebSocket URLを使用した WebTransport 接続のコンソール出力。

Web Transportの利点

現代的代替案: Web Transportは、TCPやUDPのような従来のウェブ通信プロトコルに対する現代的な代替手段を提供します。

効率的なデータ転送: 複数のストリームや高度な機能を活用することで効率的なデータ転送を提供します。

高性能: 低遅延で信頼性のあるデータ転送を必要とする高性能なウェブアプリケーションの構築に適しています。

多重化ストリーム: 単一の接続を通じて、複数のデータストリームを同時に送受信できる多重化ストリームをサポートします。

革新: ウェブ開発者がWeb Transportを採用し続けるにつれて、ウェブ通信プロトコルにおいてさらなる革新が見込まれます。

ユーザーエクスペリエンスの向上: Web Transportの採用により、データ転送が速く、より信頼性が高まることで、ウェブ上でユーザーエクスペリエンスが向上する可能性があります。

IronPDFライブラリの紹介

IronPDFは、C#を使用する開発者向けに特別に設計された総合的な.NET PDFライブラリです。 この強力なツールは、開発者が簡単に作成, 操作する、および読込アプリケーション内のPDFファイル。 IronPDFを使用すると、開発者はPDFドキュメントを生成できます。HTML文字列, HTMLファイル、およびURLさまざまな使用ケースに非常に多用途であるため。 さらに、IronPDFはヘッダー、フッター、透かしなどを追加する高度なPDF編集機能を提供しています。 そのシームレスなC#プロジェクトへの統合は、NuGetパッケージマネージャーを介してPDFファイルを扱うプロセスを簡素化し、開発を合理化し、生産性を向上させます。

Socket io .NET(開発者向けの仕組み): 図7 - IronPDF for .NET: C# PDFライブラリ

NuGetパッケージマネージャーでインストール

Visual StudioでIronPDFをインストールするか、コマンドラインからNuGetパッケージマネージャーを使用してインストールします。 Visual Studioでコンソールに移動します:

  • ツール -> NuGetパッケージマネージャ -> パッケージマネージャコンソール
Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
VB   C#

IronPDFコード例

以下は、を使用した簡単な例です。IronPDFビットデータをPDFファイルに変換するには、MainメソッドでGeneratePDFメソッドを呼び出し、上記の例で使用したデータをパラメーターとして渡します。

using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SocketIO.Demo 
{
 class Program
 {
     static async Task Main(string[] args)
     {
         // The WebSocket URI
         string uri = "wss://echo.websocket.org";
         // Creating a new WebSocket connection
         using (ClientWebSocket webSocket = new ClientWebSocket())
         {
             await webSocket.ConnectAsync(new Uri(uri), CancellationToken.None);
             Console.WriteLine("Connected to the server");
             // Sending data over the WebSocket
             byte[] sendBuffer = new byte[] { 1, 2, 3, 4 };
             await webSocket.SendAsync(new ArraySegment<byte>(sendBuffer), WebSocketMessageType.Binary, true, CancellationToken.None);
             Console.WriteLine("Data sent to the server");
             // Receiving data from the WebSocket
             byte[] receiveBuffer = new byte[1024];
             WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
             byte[] data = new byte[result.Count];
             Array.Copy(receiveBuffer, data, result.Count);
             Console.WriteLine("Received data: " + BitConverter.ToString(data));
              // Data to Generate in PDF File
              string pdfData = BitConverter.ToString(data);
              PDFGenerator.GeneratePDF(pdfData);
         }
     }
 }
}
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SocketIO.Demo 
{
 class Program
 {
     static async Task Main(string[] args)
     {
         // The WebSocket URI
         string uri = "wss://echo.websocket.org";
         // Creating a new WebSocket connection
         using (ClientWebSocket webSocket = new ClientWebSocket())
         {
             await webSocket.ConnectAsync(new Uri(uri), CancellationToken.None);
             Console.WriteLine("Connected to the server");
             // Sending data over the WebSocket
             byte[] sendBuffer = new byte[] { 1, 2, 3, 4 };
             await webSocket.SendAsync(new ArraySegment<byte>(sendBuffer), WebSocketMessageType.Binary, true, CancellationToken.None);
             Console.WriteLine("Data sent to the server");
             // Receiving data from the WebSocket
             byte[] receiveBuffer = new byte[1024];
             WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
             byte[] data = new byte[result.Count];
             Array.Copy(receiveBuffer, data, result.Count);
             Console.WriteLine("Received data: " + BitConverter.ToString(data));
              // Data to Generate in PDF File
              string pdfData = BitConverter.ToString(data);
              PDFGenerator.GeneratePDF(pdfData);
         }
     }
 }
}
Imports System
Imports System.Net.WebSockets
Imports System.Text
Imports System.Threading
Imports System.Threading.Tasks
Namespace SocketIO.Demo
 Friend Class Program
	 Shared Async Function Main(ByVal args() As String) As Task
		 ' The WebSocket URI
		 Dim uri As String = "wss://echo.websocket.org"
		 ' Creating a new WebSocket connection
		 Using webSocket As New ClientWebSocket()
			 Await webSocket.ConnectAsync(New Uri(uri), CancellationToken.None)
			 Console.WriteLine("Connected to the server")
			 ' Sending data over the WebSocket
			 Dim sendBuffer() As Byte = { 1, 2, 3, 4 }
			 Await webSocket.SendAsync(New ArraySegment(Of Byte)(sendBuffer), WebSocketMessageType.Binary, True, CancellationToken.None)
			 Console.WriteLine("Data sent to the server")
			 ' Receiving data from the WebSocket
			 Dim receiveBuffer(1023) As Byte
			 Dim result As WebSocketReceiveResult = Await webSocket.ReceiveAsync(New ArraySegment(Of Byte)(receiveBuffer), CancellationToken.None)
			 Dim data(result.Count - 1) As Byte
			 Array.Copy(receiveBuffer, data, result.Count)
			 Console.WriteLine("Received data: " & BitConverter.ToString(data))
			  ' Data to Generate in PDF File
			  Dim pdfData As String = BitConverter.ToString(data)
			  PDFGenerator.GeneratePDF(pdfData)
		 End Using
	 End Function
 End Class
End Namespace
VB   C#

PDF生成クラスコード

using IronPdf;
namespace SocketIO.Demo
{
    public class PDFGenerator
    {
        public static void GeneratePDF(string data)
        {
          IronPdf.License.LicenseKey = "Your-Licence-Key-Here";
          Console.WriteLine("PDF Generating Started...");
      // Instantiate Renderer
          var renderer = new ChromePdfRenderer();
          Console.WriteLine("PDF Processing ....");
          var pdf = renderer.RenderHtmlAsPdf(data);
          string filePath = "Data.pdf";
          pdf.SaveAs(filePath);
          Console.WriteLine($"PDF Generation Completed,File Saved as ${filePath}");
        }
    }
}
using IronPdf;
namespace SocketIO.Demo
{
    public class PDFGenerator
    {
        public static void GeneratePDF(string data)
        {
          IronPdf.License.LicenseKey = "Your-Licence-Key-Here";
          Console.WriteLine("PDF Generating Started...");
      // Instantiate Renderer
          var renderer = new ChromePdfRenderer();
          Console.WriteLine("PDF Processing ....");
          var pdf = renderer.RenderHtmlAsPdf(data);
          string filePath = "Data.pdf";
          pdf.SaveAs(filePath);
          Console.WriteLine($"PDF Generation Completed,File Saved as ${filePath}");
        }
    }
}
Imports IronPdf
Namespace SocketIO.Demo
	Public Class PDFGenerator
		Public Shared Sub GeneratePDF(ByVal data As String)
		  IronPdf.License.LicenseKey = "Your-Licence-Key-Here"
		  Console.WriteLine("PDF Generating Started...")
	  ' Instantiate Renderer
		  Dim renderer = New ChromePdfRenderer()
		  Console.WriteLine("PDF Processing ....")
		  Dim pdf = renderer.RenderHtmlAsPdf(data)
		  Dim filePath As String = "Data.pdf"
		  pdf.SaveAs(filePath)
		  Console.WriteLine($"PDF Generation Completed,File Saved as ${filePath}")
		End Sub
	End Class
End Namespace
VB   C#

出力

Socket io .NET(開発者向けの動作原理):図8 - SOcket.IOとIronPDFを使用したコンソール出力

提供されたコードでは、IronPDFを使用して、WebSocket接続を介して受信した16進文字列からPDFドキュメントを生成します。 GeneratePDF メソッドは、ライセンスキーで IronPDF を初期化し、その ChromePdfRenderer インスタンスを使用して、RenderHtmlAsPdf メソッドを通じて 16 進文字列を HTML コンテンツとして PDF にレンダリングします。 から無料のライセンスキーを取得できます。これ. このPDFは、その後、SaveAsメソッドを使用してローカルに「Data.pdf」として保存されます。 IronPDFの統合により、動的なWebSocketデータをシームレスに構造化されたPDF形式に変換できるため、リアルタイムデータストリームをアーカイブ文書に変換する際の有用性が示されます。

PDFファイルが生成されました

Socket io .NET(開発者向けの動作方法):図9 - IronPDFを使用して生成された出力PDF

結論

利用Socket.IOC# を使用することで、JavaScript や Node.js の領域を超えて、接続されたクライアントとのリアルタイムの対話の機会が数多く提供されます。 ツールの統合などSocket.IO以下のコンテンツを日本語に翻訳してください:IronPDFあなたの.NETプロジェクトに組み込むことで、リアルタイムの通信とPDF処理機能を大幅に強化することができます。 Socket.IOは、クライアントとサーバー間のシームレスなリアルタイム双方向通信を可能にし、IronPDFは堅牢な機能を提供します。作成以下のコンテンツを日本語に翻訳してください:操縦PDFドキュメントを簡単に。

IronPDFそのフルポテンシャルを解き放ち、C#アプリケーションで効率的かつ信頼性の高いPDF生成と操作を確保します。

< 以前
C# foreach with index (開発者のための仕組み)
次へ >
Junit Java(開発者向けの働き方)