フッターコンテンツにスキップ
.NETヘルプ

Socket io .NET(開発者向けの仕組み)

Socket.IO サーバーは、リアルタイムの双方向およびイベント駆動通信を促進する堅牢なライブラリとして位置づけられています。 これは、チャットアプリケーション、ライブアップデート、コラボレーションプラットフォームなどのタスクにおいてWebアプリケーションで広く使用されています。 Socket.IOは通常JavaScriptと関連付けられていますが、C#を使用してクライアント側で効果的に使用することもできます。 クライアントは時折、Webブラウザである可能性があります。 この記事では、C#環境でSocket.IOクライアントを設定および使用する方法を探ります。 基本的な例をいくつか紹介し、その利点と可能な使用ケースを結論として述べます。

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

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

  • HTTP ロングポーリング
  • Webソケット

    • Webトランスポート

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

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

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

Socket io .NET (開発者向けの機能): 図2 - 新しいプロジェクト作成ウィンドウのスクリーンショット。

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

Socket.IOとは何ですか?

Socket.IOは、ウェブクライアントとサーバーがリアルタイムで通信する力を持つJavaScriptライブラリです。 それは2つの部分で構成されています:

Socket IOの部品

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

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

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

まず、必要なNuGetパッケージをインストールしてください。 これをPackage Manager Consoleを経由して行うか、プロジェクトファイルにリファレンスを追加することで行うことができます:

Install-Package SocketIoClientDotNet

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

Socket io .NET (開発者向けの機能): 図3 - SocketIoClientDotNetパッケージ名をNuGetパッケージマネージャの検索バーに入力し、プロジェクトを選択してインストールボタンをクリックすることでManage NuGet Package for Solutionを使用して .NET用Socket.IOをインストールします。

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

Socket.IO の作成

C#クライアントに取り掛かる前に、Visual Studioで.NET Coreコンソールアプリを使用した基本的なSocket IOの例を設定しましょう。 これにより、クライアント実装をテストできます。

サーバー実装の作成

以下のコードは、クライアント接続をポート 3000 でリッスンする基本的な Socket.IO サーバーを C# で設定します。クライアントからメッセージが送信されると、サーバーはメッセージをログに記録し、受信を確認するためにクライアントに応答します。

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();
        }
    }
}
$vbLabelText   $csharpLabel

コードの説明

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

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

次に、socket.Emit("message", "Hello from C# client!") を使用して、クライアントからサーバーにメッセージを発信します。 これにより、"Hello from C# client!"という内容のメッセージがサーバーに送信されます。

次に、socket.On("message", (data) => { ... }) を使用して"message" イベントのためにコールバックを登録することで、サーバーからのメッセージをリッスンします。 })。 クライアントからサーバーへの接続が切断された場合 (Socket.EVENT_DISCONNECT`)、切断を示すメッセージを印刷します。

最後に、Console.ReadLine() メソッドは、実行後すぐにプログラムが終了しないようにコンソールウィンドウを開いた状態に保ちます。

最後に、Console.ReadLine()メソッドはコンソールウィンドウを開いたままにし、プログラムが実行後すぐに終了しないようにします。 Socket io .NET (開発者向けの機能): 図4 - サンプルコード

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

HTTPロングポーリング

ロングポーリングは、クライアント(通常はWebブラウザ)とサーバーの間でライブラリを使用してメッセージを送信するWeb開発で使用される技法です。

連続したポーリングを必要とせずに、クライアントが受信できるイベントをサーバー側でトリガーすることにより、リアルタイム通信を可能にします。 この方法は、チャットアプリケーションや株式ティッカーなどの即時更新が要求されるアプリケーションに特に有用です。 このメソッドは、チャットアプリケーションや株価ティッカーなど、即時の更新が必要なアプリケーションに特に便利です。

Socket io .NET (開発者向けに機能する方法): 図 5 - HTTP ロングポーリング

WebSocketは、単一のTCP接続を介して全二重通信チャンネルを確立することによって双方向通信を促進します。

このプロトコルは、クライアント(通常はWebブラウザ)とサーバー間でリアルタイムの対話を可能にし、両方の当事者が非同期でメッセージを交換できるようにします。 このプロトコルは、通常はウェブブラウザーであるクライアントとサーバー間でのリアルタイムのインタラクションを可能にし、双方が非同期的にメッセージを交換できるようにします。

クライアントは、WebSocket接続を確立する意思を示すWebSocketハンドシェイク要求をサーバーに送信します。

ハンドシェイク要求を受信すると、サーバーはWebSocketハンドシェイク応答を返し、接続が正常に確立されたことを示します。 ハンドシェイク要求を受信すると、サーバーは WebSocket ハンドシェイク応答を返し、接続が正常に確立されたことを示します。 WebSocket 接続を介して送信されるメッセージは、任意のフォーマット (例: テキストまたはバイナリ) であり、非同期に送受信できます。

ウェブトランスポート

Web Transport は、従来の TCP や UDP プロトコルの限界を超えてウェブ通信を強化する追加機能を導入する最先端のプロトコルです。UDP と QUIC を活用して、前の世代の欠点に対処し、よりユーザーフレンドリーで効率的にしています。 ユーザーにとって、これはレイテンシの低減と改善された輻輳制御に変換され、最終的にはより滑らかで反応の良いウェブ体験を提供します。 さらに、ウェブトランスポートはより優れたセキュリティ対策を提供し、TCPに比べてより安全なデータ転送を保証します。これらの進展により、ウェブトランスポートはデータ転送の時間のかかる側面を軽減し、クライアントとサーバーの両方に対して全体的なパフォーマンスを最適化します。

ウェブアプリケーションでウェブトランスポートを使用する基本的な例は次のとおりです:

using System;
using System.Net.WebSockets;
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.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));
            }
        }
    }
}
$vbLabelText   $csharpLabel

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

上記のコードの出力

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

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

ウェブトランスポートの利点

  • 現代の代替手段: Web Transport は、従来のウェブ通信プロトコルである TCP や UDP に対する現代の代替手段を提供します。
  • 効率的なデータ転送 : 複数のストリームと高度な機能を活用して、効率的なデータ転送を提供します。
  • 高パフォーマンス : レイテンシが低く、信頼性のあるデータ転送を求められる高パフォーマンスのウェブアプリケーションを構築するのに適しています。
  • マルチプレキシストリーム : マルチプレキシストリームをサポートしており、単一の接続上で複数のデータストリームを同時に送受信できます。
  • 革新: ウェブ開発者が Web Transport を採用し続ける中で、ウェブ通信プロトコルにおけるさらなる革新が期待できます。

IronPDFライブラリの紹介

IronPDF ライブラリの紹介

IronPDFは、C#を使用する開発者向けに特別に設計された包括的な.NET PDFライブラリです。 IronPDFを使用すると、開発者はHTML stringsHTML files、およびURLsからPDFドキュメントを生成できるため、多様なユースケースに非常に適しています。 IronPDF を使用すると、開発者は HTML 文字列HTML ファイル、および URL から PDF ドキュメントを生成でき、多様なユースケースに対応する柔軟性があります。 さらに、IronPDF はヘッダー、フッター、水印の追加など、先進的な PDF 編集機能を提供します。 NuGet パッケージマネージャーを介した C# プロジェクトへのシームレスな統合により、PDF ファイルの取り扱いが簡素化され、開発が効率化され、生産性が向上します。

Socket io .NET (開発者向けに機能する方法): 図 7 - IronPDF for .NET: C# PDF ライブラリ

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

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

IronPDFのコード例

Install-Package IronPdf

IronPDFのコード例

IronPDFを使用してバイナリデータをPDFファイルに変換する簡単な例を示します。上記の例で用いたデータをパラメータとして、Mainメソッド内でGeneratePDFメソッドを呼び出します:

using System;
using System.Net.WebSockets;
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.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);
            }
        }
    }
}
$vbLabelText   $csharpLabel

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($"<h1>Received Data</h1><p>{data}</p>");
            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($"<h1>Received Data</h1><p>{data}</p>");
            string filePath = "Data.pdf";
            pdf.SaveAs(filePath);
            Console.WriteLine($"PDF Generation Completed. File Saved as {filePath}");
        }
    }
}
$vbLabelText   $csharpLabel

出力

提供されたコードでは、IronPDFを用いて、WebSocket接続を通じて受け取ったヘキサデシマル文字列からPDFドキュメントを生成します。

提供されたコードでは、IronPDF を使用して、WebSocket 接続によって受信した16進数の文字列から PDF ドキュメントを生成します。 GeneratePDFメソッドは、ライセンスキーでIronPDFを初期化し、RenderHtmlAsPdfメソッドを使用して、16進数文字列をHTMLコンテンツとしてPDFにレンダリングするためにそのChromePdfRendererインスタンスを使用します。 無料のライセンスキーはこちらから取得できます。 このPDFは、SaveAsメソッドを使用して"Data.pdf"としてローカルに保存されます。 ### 生成されたPDFファイル

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

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

結論

.NETプロジェクトにSocket.IOやIronPDFなどのツールを統合することで、リアルタイム通信やPDF処理能力を大幅に強化することができます。 Socket.IOはクライアントとサーバー間でシームレスなリアルタイム双方向通信を促進し、IronPDFはPDFドキュメントを作成および操作するための強力な機能を提供します。 Socket.IOはクライアントとサーバー間のシームレスなリアルタイム双方向通信を容易にし、IronPDFは作成操作のための堅牢な機能を提供します。

よくある質問

C#環境でSocket.IOクライアントをセットアップするにはどうすればいいですか?

C#環境でSocket.IOクライアントをセットアップするには、SocketIoClientDotNetパッケージを使用できます。これにより、あなたのC#アプリケーションがSocket.IOサーバーと通信し、リアルタイムで双方向の通信を可能にします。

ウェブアプリケーションでSocket.IOを使用する利点は何ですか?

Socket.IOはリアルタイムの双方向でイベント駆動型の通信を提供し、チャットアプリケーション、コラボレーションプラットフォーム、オンラインゲームなど、ライブアップデートが必要なウェブアプリケーションに最適です。

Socket.IOをVisual Studio 2022で使用できますか?

はい、Socket.IOはVisual Studio 2022でコンソールプロジェクトを作成し、SocketIoClientDotNetなどの必要なパッケージをインストールすることで、C#アプリケーションでリアルタイム通信を可能にします。

IronPDFはSocket.IOを使用したリアルタイムアプリケーションをどのように強化できますか?

IronPDFは、開発者がリアルタイムWebSocketデータからPDFを生成および操作することを可能にすることで、リアルタイムアプリケーションを強化できます。これは動的なデータストリームから構造化されたドキュメントを作成するのに便利です。

C#クライアントをSocket.IOサーバーに接続するプロセスは何ですか?

C#クライアントをSocket.IOサーバーに接続するには、SocketIoClientDotNetパッケージを使用する必要があります。これには、クライアントを設定してイベントをリッスンおよび送信することが含まれ、サーバーとのリアルタイム通信を可能にします。

HTTPロングポーリングはSocket.IOでどのように機能しますか?

HTTPロングポーリングは、Socket.IOが持続的な接続を維持するために使用する方法であり、サーバーが応答するまでリクエストをオープンに保ち、新しいデータが利用可能になったときにすぐに更新を行います。

WebSocketはSocket.IO通信でどのような役割を果たしますか?

WebSocketはSocket.IO通信において重要な役割を果たし、単一のTCP接続を介してフルデュプレックスの通信を可能にし、クライアントとサーバー間の効率的なリアルタイムデータ交換を促進します。

SocketIoClientDotNetパッケージはどのようにインストールしますか?

NuGetパッケージマネージャーを使用して、Visual StudioでSocketIoClientDotNetパッケージをインストールできます。パッケージマネージャーコンソールを開いて次のコマンドを実行します: Install-Package SocketIoClientDotNet

Socket.IOとIronPDFを統合するユースケースは何ですか?

Socket.IOとIronPDFを統合することは、動的データからPDFを生成する必要があるリアルタイムアプリケーションに役立ち、レポート作成ツール、ライブデータ分析、および自動ドキュメント生成システムに適しています。

Socket.IOでWeb Transportを使用する利点は何ですか?

Web Transportは、従来のTCPおよびUDPに比べて遅延と輻輳制御が改善され、多重化されたストリームとセキュリティが強化されており、現代のリアルタイム通信要件に適しています。

Jacob Mellor、Ironチームの最高技術責任者(CTO)
最高技術責任者(CTO)

Jacob Mellorは、Iron Softwareの最高技術責任者であり、C# PDF技術の開拓者としてその先進的な役割を担っています。Iron Softwareのコアコードベースのオリジナルデベロッパーである彼は、創業時から製品のアーキテクチャを形作り、CEOのCameron Rimingtonと協力してNASA、Tesla、全世界の政府機関を含む50人以上の会社に成長させました。

Jacobは、1998年から2001年にかけてマンチェスター大学で土木工学の第一級優等学士号(BEng)を取得しました。1999年にロンドンで最初のソフトウェアビジネスを立ち上げ、2005年には最初の.NETコンポーネントを作成し、Microsoftエコシステムにおける複雑な問題の解決を専門にしました。

彼の旗艦製品であるIronPDFとIronSuite .NETライブラリは、全世界で3000万以上のNuGetインストールを達成しており、彼の基本コードが世界中で使用されている開発者ツールを支えています。商業的な経験を25年間積み、コードを書くことを41年間続けるJacobは、企業向けのC#、Java、およびPython PDF技術の革新を推進し続け、次世代の技術リーダーを指導しています。