C# 实现WebSocket服务端教程

针对“C# 实现WebSocket服务端教程”,我将提供完整的攻略。下面是详细的步骤:

步骤一:创建一个空的C#控制台应用程序

可以使用Visual Studio进行创建,也可以使用命令行创建,此处不再赘述。在创建时,需要选择.NET Core 3.x或者.NET 5+作为Target Framework。

步骤二:添加NuGet包

在控制台中输入以下命令,添加System.Net.WebSockets NuGet包:

dotnet add package System.Net.WebSockets

步骤三:实现WebSocketServer

在应用程序的根目录下,创建WebSocketServer.cs文件,实现WebSocket服务端的代码。以下是一个很简单的示例:

using System;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace WebSocketServerDemo
{
    public class WebSocketServer
    {
        private readonly HttpListener httpListener;
        private readonly CancellationTokenSource cts = new CancellationTokenSource();

        public WebSocketServer(string[] prefixes)
        {
            httpListener = new HttpListener();

            foreach (var prefix in prefixes)
            {
                httpListener.Prefixes.Add(prefix);
            }
        }

        public async Task StartAsync()
        {
            httpListener.Start();

            Console.WriteLine("WebSocket server started.");

            while (!cts.Token.IsCancellationRequested)
            {
                var listenerContext = await httpListener.GetContextAsync();

                if (listenerContext.Request.IsWebSocketRequest)
                {
                    var webSocketContext = await listenerContext.AcceptWebSocketAsync(subProtocol: null);

                    await HandleWebSocketRequestAsync(webSocketContext.WebSocket);
                }
                else
                {
                    listenerContext.Response.StatusCode = 400;
                    listenerContext.Response.Close();
                }
            }
        }

        private async Task HandleWebSocketRequestAsync(WebSocket webSocket)
        {
            var buffer = new byte[1024];
            var receiveResult = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), cts.Token);

            while (!receiveResult.CloseStatus.HasValue)
            {
                var message = Encoding.UTF8.GetString(buffer, 0, receiveResult.Count);
                Console.WriteLine($"Received message: {message}");

                var response = Encoding.UTF8.GetBytes($"[Echo] {message}");
                await webSocket.SendAsync(new ArraySegment<byte>(response, 0, response.Length), WebSocketMessageType.Text, true, CancellationToken.None);

                receiveResult = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), cts.Token);
            }

            await webSocket.CloseAsync(receiveResult.CloseStatus.Value, receiveResult.CloseStatusDescription, CancellationToken.None);
        }

        public void Stop()
        {
            cts.Cancel();
            httpListener.Stop();
        }
    }
}

步骤四:启动WebSocket服务端

Program.cs文件中,编写启动WebSocket服务端的代码。以下是示例代码:

using System;
using System.Threading.Tasks;

namespace WebSocketServerDemo
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var server = new WebSocketServer(new[] { "http://localhost:8000/" });

            await server.StartAsync();
        }
    }
}

这将启动一个WebSocket服务端,监听在http://localhost:8000/地址。

示例一:使用JavaScript进行测试

如果WebSocket服务端启动成功,在浏览器中打开Html文件时就可以使用WebSocket发送消息,观察服务端是否正常接收。

以下是Html文件中示例的JavaScript代码:

const webSocket = new WebSocket('ws://localhost:8000/');
webSocket.onopen = function (event) {
    console.log('WebSocket is open now.');
}
webSocket.onmessage = function (event) {
    console.log(`WebSocket received message: ${event.data}`);
}
webSocket.onerror = function (event) {
    console.error('WebSocket error: ', event);
}
webSocket.onclose = function (event) {
    console.log('WebSocket close: ', event);
}

webSocket.send('Hello, WebSocket!');

当JavaScript代码过程中调用了send方法时,会向WebSocket服务端发送一条消息。

示例二:使用C# HttpClient进行测试

以下是通过C# HttpClient进行测试的代码:

using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace WebSocketServerDemo
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var server = new WebSocketServer(new[] { "http://localhost:8000/" });

            _ = server.StartAsync();

            using (var httpClient = new HttpClient())
            {
                await httpClient.GetStringAsync("http://localhost:8000/");

                using (var webSocketClient = new ClientWebSocket())
                {
                    await webSocketClient.ConnectAsync(new Uri("ws://localhost:8000/"), default);

                    var buffer = new byte[1024];
                    var message = new ArraySegment<byte>(buffer);

                    foreach (var msg in new[] { "Hello, WebSocket!", "Are you there?" })
                    {
                        Console.WriteLine($"Send message: {msg}");

                        var messageSegment = new ArraySegment<byte>(Encoding.UTF8.GetBytes(msg));
                        await webSocketClient.SendAsync(messageSegment, WebSocketMessageType.Text, endOfMessage: true, CancellationToken.None);

                        var receiveResult = await webSocketClient.ReceiveAsync(message, CancellationToken.None);
                        var response = Encoding.UTF8.GetString(buffer, 0, receiveResult.Count);

                        Console.WriteLine($"Receive message: {response}");
                    }

                    await webSocketClient.CloseAsync(WebSocketCloseStatus.NormalClosure, "Close from WebSocketClient.", default);
                }
            }

            server.Stop();
        }
    }
}

当代码过程中创建了一个ClientWebSocket时,就可以使用其发送和接收WebSocket消息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 实现WebSocket服务端教程 - Python技术站

(1)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#根据日期计算星期几的实例代码

    下面我来详细讲解一下“C#根据日期计算星期几的实例代码”的完整攻略。 1. 实现思路 要计算某个日期是星期几,可以使用.NET Framework中的DateTime类中的DayOfWeek属性,该属性返回一个枚举类型的星期几。然而使用DayOfWeek属性是有一些限制的,它只允许你输入一个DateTime类型的日期对象。如果你想要输入一个简单的日期字符串,…

    C# 2023年6月1日
    00
  • C#如何访问共享文件夹或者磁盘

    下面是关于如何在C#中访问共享文件夹或磁盘的完整攻略。 访问共享文件夹 访问共享文件夹需要知道目标文件夹的网络路径以及必要的访问权限。以下是访问共享文件夹的示例代码: using System.IO; string sharedFolderPath = @"\\SERVER\ShareFolder"; // 共享文件夹的网络路径 stri…

    C# 2023年6月1日
    00
  • C# GetHashCode():获取此实例的哈希代码

    C#中的GetHashCode()方法用于获取对象的哈希码(HashCode)。哈希码是一种用于快速识别对象的整数。哈希码的计算方法是将对象中各种不同类型的值转换成32位整数。通常,我们使用哈希表来操作对象。哈希表将哈希码作为索引,通过哈希码查找对象,这样可以非常快速地定位到对象。 以下是使用GetHashCode()方法的一些示例: 示例1: class …

    C# 2023年4月19日
    00
  • C# WebApi 路由机制剖析

    这里详细讲解一下C# WebApi路由机制。 什么是C#WebApi路由机制 在C# WebApi中,路由机制(Route mechanism)是指当客户端发送一个HTTP请求到服务端时,系统如何根据请求的URL和HTTP方法来匹配对应的API方法。这个过程就是通过路由机制来实现的。路由机制可以将请求URL和HTTP方法映射到相应的API方法。 路由的两种类…

    C# 2023年5月15日
    00
  • C#实现程序等待延迟执行的方法

    首先,C#中实现程序等待延迟执行的方法有多种,其中比较常用的有以下两种: Thread.Sleep()方法 这种方法实现起来比较简单,通过让线程休眠指定的时间(以毫秒为单位),使得程序延迟执行。示例代码如下所示: using System; using System.Threading; class Program { static void Main(st…

    C# 2023年6月1日
    00
  • 在asp.NET中字符串替换的五种方法第2/2页

    好的。在asp.NET中字符串替换的五种方法是一个比较常见的问题。我将为您提供完整攻略,包括步骤、代码块和示例说明。 步骤 在ASP.NET中,字符串替换的五种方法如下: Replace 方法 Regex.Replace 方法 StringBuilder.Replace 方法 StringBuffer.Replace 方法 String.Format 方法 …

    C# 2023年6月3日
    00
  • Windows系统常用运行库有哪些?常用系统运行支持库合集(附下载)

    Windows系统常用运行库 什么是运行库 运行库(runtime library)和操作系统是相互配合的。简单来说,运行库包含了操作系统底层API的实现,并且提供给应用程序进行调用。在使用某些应用程序的时,你需要安装相应的运行库才能运行。 为了保证不同应用程序的共用和标准化,Windows系统自带了一些常用的运行库,同时也有一些常用的系统运行支持库可以供下…

    C# 2023年6月3日
    00
  • C#使用Aspose.Cells控件读取Excel

    以下是“C#使用Aspose.Cells控件读取Excel”的完整攻略,包括了两个示例: 1. 安装Aspose.Cells控件 要使用Aspose.Cells控件,需要先安装它。可以通过NuGet命令行工具安装或通过Visual Studio的NuGet包管理器来安装。具体操作步骤如下: 打开Visual Studio,打开项目,右键单击项目文件夹,选择“…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部