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#中foreach实现原理详解

    C#中foreach实现原理详解 在C#语言中,foreach可以用于遍历数组、集合和自定义类型等可迭代对象。本文将详细介绍foreach的实现原理,让读者更深入地了解该语法的运行机制。 foreach语法 foreach语法的基本形式如下: foreach (var variable in expression) { // code block } 其中,…

    C# 2023年6月7日
    00
  • c# 如何用lock解决缓存击穿

    当系统中缓存访问热点集中,且其中某些key的缓存失效时间过短,导致大量的请求直接访问DB,从而在DB上产生很大的压力,遇到高并发情况下往往会导致系统崩溃。这种情况就被称为“缓存击穿”。 C#语言提供了一种避免缓存击穿的方法,就是使用lock关键字,将可能产生高并发的代码块锁住,这样系统中只有一个线程能够访问这段代码,从而避免了缓存击穿的情况。 下面是使用lo…

    C# 2023年6月1日
    00
  • .Net常见问题之C#中的委托

    关于”.Net常见问题之C#中的委托”,我将从概念、使用和示例方面进行详细讲解。 概念 C#中的委托是指一个函数指针,它允许开发者将方法作为参数进行传递。委托可以用于事件处理、回调函数以及多线程编程。 委托是一个类型,它定义了一个函数签名(包括返回值类型、参数列表和参数类型)。委托类型的对象可包装对那些具有相同返回类型和参数类型的方法的引用。 使用 使用委托…

    C# 2023年6月7日
    00
  • ASP.NET(C#)中操作SQLite数据库实例

    下面我将为您详细讲解ASP.NET(C#)中操作SQLite数据库的完整攻略,以及两条示例说明。 一、介绍 SQLite是轻型关系型数据库管理系统,由C语言编写而成,并支持多种编程语言。SQLite由于其小巧、快速、高效、简单易用等优点,在移动应用开发、嵌入式系统开发等领域得到了广泛应用。 ASP.NET(C#)是一种基于.NET Framework的Web…

    C# 2023年6月1日
    00
  • C++中访问字符串的三种方法总结

    C++中访问字符串的三种方法总结 在C++中,有多种方法可以访问字符串,下面我们来总结一下常见的三种方法。 方法一:使用数组 使用数组访问字符串的方法非常简单,字符串在C++中可以看做是一个字符数组,因此我们可以通过数组的下标访问字符串中的每一个字符。例如,假设我们有一个字符串s,我们可以通过s[i]来访问字符串中的第i个字符。字符串的最后一个字符索引为字符…

    C# 2023年6月8日
    00
  • 详解c# 并行计算

    详解C#并行计算攻略 前言 在当今高端计算领域,利用计算机的多核资源进行并行计算已成为一个过程中必不可少的一部分。C# .NET Framework提供了丰富的并行计算库,为我们节省了大量的编写时间,提高了计算的速度和效率。本篇文章将深入探究如何使用C# 实现并行计算。 Parallel类 Parallel类是.NET Framwork中一个非常有用的类,它…

    C# 2023年5月31日
    00
  • Redis中ServiceStack.Redis和StackExchange.Redis区别详解

    Redis中ServiceStack.Redis和StackExchange.Redis区别详解 1. 简介 ServiceStack.Redis和StackExchange.Redis是Redis的两个C#客户端库。它们都提供了操作Redis的API。本文将详细讲解ServiceStack.Redis和StackExchange.Redis的区别和使用方法…

    C# 2023年6月3日
    00
  • ASP.NET mvc异常处理的方法示例介绍

    下面详细讲解“ASP.NET MVC异常处理的方法示例介绍”的完整攻略。 1. 常见异常 在编写 ASP.NET MVC 应用时,我们经常会遇到一些异常情况,例如空指针异常、数据库连接异常等等。这些异常会影响应用功能的正常执行,所以我们需要对这些异常进行处理。下面介绍两种常见的异常处理方法。 1.1 使用Error属性 ASP.NET MVC 框架提供了一个…

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