跳過到頁腳內容
.NET幫助

Socket io .NET(對開發者如何理解的工作)

這個 Socket.IO 伺服器是強大的程式庫,促進即時、雙向和事件驅動的通信。 它廣泛用於網頁應用程式,例如聊天應用程式、即時更新和協作平台。 雖然Socket.IO通常與JavaScript相關聯,但也可以在C#上的客戶端有效地使用。 有時客戶端可能是網頁瀏覽器。 在這篇文章中,我們將探討如何在C#環境中設置和使用Socket.IO客戶端。 我們將通過一些基本示例,最後討論其優勢和潛在用途。

建立 Socket.IO 連接的方法

可以使用不同的低階傳輸方式來建立 Socket.IO 連接:

  • HTTP長輪詢
  • Web Sockets

    • Web Transport

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上。

安裝必要的套件

要在Visual Studio中使用.NET應用程式的Socket.IO,您需要兼容的伺服器實現。 其中一個實現是.NET的 SocketIoClientDotNet,允許Socket.IO客戶端從C#應用程式連接到Socket.IO伺服器。

首先,安裝所需的NuGet套件。 您可以通過套件管理控制台或通過將參考添加到您的專案文件來完成此操作:

Install-Package SocketIoClientDotNet

SocketIoClientDotNet套件的截圖

Socket io .NET (How It Works For Developers): Figure 3 - Install Socket.IO for NET using the Manage NuGet Package for Solution by searching SocketIoClientDotNet package name in the search bar of NuGet Package Manager, then select the project and click on the Install button.

執行此命令將把Socket.IO客戶端程式庫加入到您的.NET專案中,使您的C#應用程式能夠與Socket.IO伺服器連接,促進用戶與系統之間的通信。

創建Socket.IO

在了解C#客戶端之前,讓我們設置一個使用.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();
        }
    }
}
$vbLabelText   $csharpLabel

代碼解釋

在代碼段中,首先通過調用IO.Socket("http://localhost:3000")創建了一個Socket.IO客戶端實例,該實例連接到客戶端機器上運行的本地伺服器的3000端口。

成功連接後(Socket.EVENT_CONNECT),我們會打印消息,指示我們已連接到伺服器。

接下來,使用socket.Emit("message", "Hello from C# client!")從客戶端發送消息到伺服器。 這將消息"Hello from C# client!"的內容發送到伺服器。

然後,通過註冊"message"事件的回調來偵聽伺服器上的消息socket.On("message", (data) => { ... })。 當伺服器發送"message"事件時,回調函數被調用,我們將接收到的消息打印到控制台。

如果從客戶端斷開伺服器連接(Socket.EVENT_DISCONNECT),我們會打印一條消息,指示斷開連接。

最後,Console.ReadLine()方法保持控制台窗口開啟,這樣程序在執行後不會立即退出。 這允許我們查看輸出並確保程序不會過早終止。

代碼的截圖

Socket io .NET(開發人員如何使用):圖4 - 示例代碼

HTTP長輪詢

長輪詢是一種用於網頁開發的技術,它使用程式庫在客戶端(通常是網頁瀏覽器)和伺服器之間發送消息。 它通過在伺服器上觸發事件來啟用即時通信,然後客戶端可以接收,無需持續輪詢。 這種方法對於需要即時更新的應用程式特別有用,例如聊天應用程式或股票行情。

Socket io .NET(開發人員如何使用):圖5 - HTTP長輪詢

Web Sockets

WebSocket透過在單個TCP連接上建立全雙工通信通道來促進雙向通信。 此協議啟用客戶端,通常是網頁瀏覽器,和伺服器之間的即時交互,讓雙方能夠異步交換消息。

建立WebSocket通信

客戶端向伺服器發送WebSocket握手請求,表示其願意建立WebSocket連接。 收到握手請求後,伺服器做出WebSocket握手響應,表示連接已成功建立。 通過WebSocket連接發送的消息可以是任何格式(如文本或二進制),可以異步發送和接收。

Web Transport

Web Transport作為一種尖端協議,引入了額外的功能以改善網絡通信,超越了傳統協議如TCP和UDP的限制。通過利用UDP和QUIC,它解決了其前身的缺陷,使其更加用戶友好和高效。 對於用戶而言,這意味著延遲減少和改善擁塞控制,最終提供更流暢和更具反應性的網絡體驗。 此外,Web Transport提供了更好的安全措施,確保比TCP更安全的數據傳輸。通過這些進步,Web Transport減少了數據傳輸耗時的方面,優化了客戶端和伺服器的整體性能。

以下是一個Web Transport如何在網頁應用程式中使用的基本示例:

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的優勢

  • 現代替代品:Web Transport為傳統的網絡通信協議如TCP和UDP提供了一個現代的替代方案。
  • 高效數據傳輸:藉由利用多路流和高級功能,它提供了高效的數據傳輸。
  • 高性能:非常適合構建要求低延遲和可靠數據傳輸的高性能網絡應用程式。
  • 多路流:支持多路流,允許多個數據流同時在單個連接上發送和接收。
  • 創新:隨著網頁開發人員繼續採用Web Transport,我們可以期望在網絡通信協議中看到更多的創新。
  • 改善的用戶體驗:採用Web Transport可能導致網頁上的用戶體驗改善,由於更快和更可靠的數據傳輸。

IronPDF程式庫介紹

IronPDF是一個完整的.NET PDF程式庫,專為使用C#的開發人員設計。 這個強大的工具允許開發人員毫不費力地在其應用程式中創建操作閱讀PDF文件。 使用IronPDF,開發人員可以從HTML字符串HTML文件網址生成PDF文檔,使其可以廣泛應用于各種使用情境。 此外,IronPDF還提供了高級PDF編輯功能,譬如添加頁眉、頁腳、水印等等。 通過NuGet套件管理器,將其無縫整合到C#專案中簡化了PDF文件的處理過程,優化開發並提高生產力。

Socket io .NET(開發人員如何使用):圖7 - IronPDF for .NET: The C# PDF Library

用NuGet套件管理器安裝

在Visual Studio或使用NuGet套件管理器命令行中安裝IronPDF。 在Visual Studio中,轉到控制台:

  • 工具 -> NuGet套件管理器 -> 套件管理控制台
Install-Package IronPdf

IronPDF代碼示例

這裡是一個使用IronPDF將二進制數據轉換為PDF文件的簡單例子。 在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

輸出

Socket io .NET(開發人員如何使用):圖8 - 使用Socket.IO和IronPDF的控制台輸出

在所提供的代碼中,IronPDF用於從WebSocket連接接收到的十六進制字符串生成PDF文檔。 RenderHtmlAsPdf方法。 您可以從這裡獲取您的免費授權金鑰。 然後使用SaveAs方法將此PDF本地保存為 "Data.pdf"。 IronPDF的整合允許動態WebSocket數據不間斷地轉換為結構化PDF格式,證明其在將即時數據流轉化為歸檔文件中的實用性。

PDF文件生成

Socket io .NET(開發人員如何使用):圖9 - 使用IronPDF生成的PDF結果

結論

將Socket.IO與C#結合使用,為連接客戶端的即時互動提供了無數機會,超越了JavaScript和Node.js的領域。 將Socket.IO和IronPDF等工具整合到您的.NET專案中,可以顯著增強即時通信和PDF處理能力。 Socket.IO便利了客戶端與伺服器之間的無縫即時、雙向通信,而IronPDF則為創建操作PDF文檔提供了強大功能。

常見問題解答

如何在 C# 環境中設置 Socket.IO 客戶端?

要在 C# 環境中設置 Socket.IO 客戶端,你可以使用 SocketIoClientDotNet 套件。這使得你的 C# 應用程序能夠與 Socket.IO 服務器通信,從而促進即時的雙向通信。

在 Web 應用中使用 Socket.IO 的優勢是什麼?

Socket.IO 提供即時的、雙向和事件驅動的通信,這對於需要實時更新的 Web 應用來說是理想的,例如聊天應用、協作平台和線上遊戲。

我可以在 Visual Studio 2022 中使用 Socket.IO 嗎?

是的,你可以在 Visual Studio 2022 中使用 Socket.IO,通過創建一個控制台項目並安裝如 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 套件?

您可以使用 Visual Studio 中的 NuGet 套件管理器來安裝 SocketIoClientDotNet 套件。打開套餐管理器控制台,然後執行命令:Install-Package SocketIoClientDotNet

將 IronPDF 與 Socket.IO 集成的用例是什麼?

將 IronPDF 與 Socket.IO 集成對於需要從動態數據生成 PDF 的即時應用程序非常有用,如報告工具、實時數據分析和自動文檔生成系統。

使用 Web Transport 在 Socket.IO 中的好處是什麼?

Web Transport 在傳統的 TCP 和 UDP 之外提供改進的延遲和擁塞控制,支持多路流和增強的安全性,適合現代即時通訊需求。

Jacob Mellor, Team Iron 首席技術官
首席技術官

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me