以下是一个基于ws协议的WebSocket服务端工具类的示例代码,可以让外部订阅消息事件:

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

namespace WebSocketServer
{
    public class WebSocketServer
    {
        private WebSocket _webSocket;
        private CancellationTokenSource _cancellationTokenSource;

        public event EventHandler<string> MessageReceived;

        public async Task StartAsync(string url)
        {
            var listener = new HttpListener();
            listener.Prefixes.Add(url);
            listener.Start();

            while (true)
            {
                var context = await listener.GetContextAsync();
                if (context.Request.IsWebSocketRequest)
                {
                    var webSocketContext = await context.AcceptWebSocketAsync(null);
                    _webSocket = webSocketContext.WebSocket;
                    _cancellationTokenSource = new CancellationTokenSource();
                    ReceiveMessages();
                }
                else
                {
                    context.Response.StatusCode = 400;
                    context.Response.Close();
                }
            }
        }

        public async Task StopAsync()
        {
            _cancellationTokenSource.Cancel();
            await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Server shutdown", CancellationToken.None);
        }

        private async void ReceiveMessages()
        {
            while (!_cancellationTokenSource.IsCancellationRequested)
            {
                var buffer = new ArraySegment<byte>(new byte[1024]);
                var result = await _webSocket.ReceiveAsync(buffer, _cancellationTokenSource.Token);

                if (result.MessageType == WebSocketMessageType.Close)
                {
                    await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Client disconnected", CancellationToken.None);
                }
                else if (result.MessageType == WebSocketMessageType.Text)
                {
                    var message = System.Text.Encoding.UTF8.GetString(buffer.Array, buffer.Offset, result.Count);
                    OnMessageReceived(message);
                }
            }
        }

        private void OnMessageReceived(string message)
        {
            MessageReceived?.Invoke(this, message);
        }
    }
}

使用方法:

var server = new WebSocketServer();
server.MessageReceived += (sender, message) =>
{
    Console.WriteLine(message);
};
await server.StartAsync("http://localhost:12345/");

可以看到,在创建WebSocketServer实例时,我们可以订阅MessageReceived事件,当有消息到达时,就会触发这个事件,外部就可以处理这个消息了

使用C# 写一个基于ws协议的WebSocket服务端工具类要求外部可以订阅消息事件

原文地址: https://www.cveoy.top/t/topic/cqav 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录