使用C# 写一个基于ws协议的WebSocket服务端工具类要求外部可以订阅消息事件
以下是一个基于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事件,当有消息到达时,就会触发这个事件,外部就可以处理这个消息了
原文地址: https://www.cveoy.top/t/topic/cqav 著作权归作者所有。请勿转载和采集!