.NET 帮助

Socket io .NET(其对开发人员的工作原理)

发布 2024年九月29日
分享:

"(《世界人权宣言》) Socket.IO 服务器被认为是一个强大的库,支持实时、双向和事件驱动的通信。 它广泛应用于网络应用中,如聊天应用、实时更新和协作平台等任务。 虽然Socket.IO通常与JavaScript相关联,但它也可以在客户端中与C#一起有效使用。 有时客户端可能是网页浏览器。 在本文中,我们将探讨如何在C#环境中设置和使用Socket.IO客户端。 我们将介绍一些基本示例,并总结其优势和潜在的使用场景。

建立 Socket.IO 连接的方法

"(《世界人权宣言》) Socket.IO 可以通过不同的低级传输建立连接:

  • HTTP 长轮询
  • Web Sockets (网络套接字)

    • 网络传输

    Socket io .NET(它如何为开发人员工作):图 1 - 客户端-服务器通信应用程序

在 Visual Studio 2022 中创建控制台项目

打开 Visual Studio,并在开始窗口中选择创建新项目

Socket io .NET(开发人员如何工作):图2 - 显示创建新项目窗口的截图。

要在Visual Studio 2022中创建控制台应用程序,首先启动Visual Studio,然后从开始窗口选择“创建新项目”。 选择“控制台应用”模板,配置项目名称和位置,确保选择 .NET 6.0。

什么是Socket.IO?

Socket.IOJavaScript库,能够让网页客户端和服务器进行实时通信。 它由两部分组成:

Socket IO的部分

  • 客户端库:在浏览器中运行。
  • 服务器端库:运行在Node.js上。

安装必要的软件包

在 .NET 应用中使用 Socket.IO Visual Studio,您需要一个兼容的服务器实现。 其中一个实现是用于 .NET 的 SocketIoClientDotNet,它允许 Socket IO 客户端从 C# 应用程序连接到 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包管理器安装Socket.IO for NET,通过在NuGet包管理器的搜索栏中搜索“SocketIoClientDotNet”包名,然后选择项目并点击安装按钮。

执行此命令将把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从客户端向服务器发送消息。("message", "来自C#客户端的问候"!"). 这将发送一条消息,内容为“Hello from C# client”!到服务器。

接下来,我们通过使用 socket.On 为 "message" 事件注册回调来监听来自服务器的消息。(“消息” (数据) => { ... }). 当服务器发送“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 作为一个尖端协议,除了传统协议如 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,开发人员可以从 HTML 字符串, HTML 文件网址,使其在各种用例中具有高度的适用性。 此外,IronPDF 提供高级 PDF 编辑功能,例如添加页眉、页脚、水印等更多功能。 通过NuGet包管理器无缝集成到C#项目中,简化了处理PDF文件的过程,简化了开发并提高了生产力。

Socket io .NET(它对开发人员的工作原理):图7 - IronPDF for .NET: C# PDF库

通过NuGet包管理器安装

在 Visual Studio 或使用 NuGet 包管理器从命令行安装 IronPDF。 在 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 连接接收的十六进制字符串生成 PDF 文档。 GeneratePDF 方法使用许可证密钥初始化 IronPDF,并使用其 ChromePdfRenderer 实例通过 RenderHtmlAsPdf 方法将十六进制字符串作为 HTML 内容渲染为 PDF。 您可以从获取您的免费许可证密钥 这里. 此 PDF 随后使用 SaveAs 方法本地保存为 "Data.pdf"。 IronPDF 的集成允许将动态 WebSocket 数据无缝转换为结构化的 PDF 格式,展示了其在将实时数据流转换为存档文件中的实用性。

生成的 PDF 文件

Socket io .NET(开发人员如何工作):图 9 - 使用 IronPDF 生成的输出 PDF

结论

利用 Socket.IO 使用C#为连接的客户端创造了实时交互的众多机会,拓展了JavaScript和Node.js的领域。 集成工具如 Socket.IOIronPDF 集成到您的.NET项目中可以显著增强实时通信和PDF处理功能。 Socket.IO 促进客户端和服务器之间无缝的实时双向通信,而 IronPDF 提供强大的功能用于 创建操纵 轻松处理PDF文档。

IronPDF 以充分释放其潜力,确保在C#应用程序中实现高效可靠的PDF生成和操作。

下一步 >
Junit Java(开发人员指南)

准备开始了吗? 版本: 2024.10 刚刚发布

免费NuGet下载 总下载量: 11,108,738 查看许可证 >