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#.NET字符串比较中忽略符号的方法

    C#.NET字符串比较时,如果需要忽略掉部分或全部符号,我们可以使用以下两种方法: 1. 使用System.Text.RegularExpressions.Regex类 使用System.Text.RegularExpressions.Regex类可以方便地实现忽略符号的字符串比较。代码示例如下: // 声明两个字符串 string str1 = &quot…

    C# 2023年6月1日
    00
  • asp.net(C#) Access 数据操作类

    当使用asp.net(C#)开发网站时,常常会用到数据库来存储和管理数据。而Access数据库是一个常见的轻量级数据库,为了方便我们对Access数据库进行数据操作,我们可以使用Access 数据操作类。下面将从以下几个方面对Access 数据操作类进行详细讲解: 数据库连接 数据库操作 示例说明 1. 数据库连接 在使用Access 数据操作类时,首先需要…

    C# 2023年6月3日
    00
  • C# 中的GroupBy的动态拼接问题及GroupBy<>用法介绍

    让我们开始讲解C#中的GroupBy的动态拼接问题及GroupBy<>用法介绍。 GroupBy 动态拼接问题 在C#中,GroupBy是一个非常常用的LINQ操作,它可以根据指定的键值来分组集合中的元素。 然而,在实际使用中,如果我们要对多个属性进行GroupBy操作,就会遇到一个动态拼接GroupBy键值的问题。比如说,我们有一个学生集合,需…

    C# 2023年6月1日
    00
  • C#获取CPU处理器核心数量的方法

    获取CPU处理器核心数量是一项常见的系统信息查询任务,本文将详细讲解C#获取CPU处理器核心数量的方法。 1. .NET Framework中获取CPU核心数量的方法 .NET Framework提供了一个名为Environment的类,可以使用该类的ProcessorCount属性轻松地获取CPU核心数量。 int coreCount = Environm…

    C# 2023年6月2日
    00
  • C# BinaryReader实现读取二进制文件

    下面是“C# BinaryReader实现读取二进制文件”的完整攻略: 1. 什么是BinaryReader BinaryReader是C#中的一个类,它可以帮助我们快速读取二进制文件中的数据。BinaryReader提供了一系列方法,以便我们能够读取基本类型的数据(如int、float、double等)和字符串等其他类型的数据。我们可以使用BinaryRe…

    C# 2023年6月1日
    00
  • C#多线程学习(二) 如何操纵一个线程

    C#多线程学习(二) 如何操纵一个线程 线程学习第一篇:C#多线程学习(一) 多线程的相关概念 下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可。(线程入口使程序知道该让这个线程干什么事) 在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程…

    C# 2023年4月24日
    00
  • C#之多余控件事件及代码删除问题

    标题:C#之多余控件事件及代码删除问题 正文: 在使用C#编写Windows应用程序时,我们有时会再设计界面时添加一些控件,后来又发现这些控件用处不大,或者我们修改了设计,需要删除这些控件,但却发现这些控件和它们绑定的事件和代码并没有完全删除。这就是所谓的多余控件事件及代码删除问题。 问题原因 造成多余控件事件及代码删除问题的原因主要有两个: 控件从设计器中…

    C# 2023年5月14日
    00
  • Ubuntu16.04系统搭建.Net Core开发环境

    在Ubuntu16.04系统上搭建.Net Core开发环境需要以下步骤: 安装依赖项:首先,我们需要安装一些依赖项。我们可以使用以下命令来安装: sudo apt-get update sudo apt-get install curl libunwind8 gettext apt-transport-https 添加Microsoft包存储库:接下来,我…

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