原文地址: https://www.jeremyjone.com/782/, 转载请注明。
感觉放了好长时间的假期。贴个 websocket 的简单示例。
整体文件结构
- 项目(WebSockets.Test)
|-- Extensions
| |-- SocketsExtension.cs
|-- Handlers
| |-- WebSocketMessageHandler.cs
|-- SocketsManager
| |-- SocketsHandler.cs
| |-- SocketsManager.cs
| |-- SocketsMiddleware.cs
|-- Program.cs
|-- Startup.cs
大体需要的文件是这些,这是最基本的示例,可以按需自行修改。
1、创建保存 WebSocket 的类
该类用于保存所有 WebSocket。
// 文件:SocketsManager/SocketsManager.cs
using System;
using System.Collections.Concurrent;
using System.Linq;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
namespace WebSockets.Test.SocketsManager
{
public class SocketsManager
{
private readonly ConcurrentDictionary<string, WebSocket> _connections =
new ConcurrentDictionary<string, WebSocket>();
/// <summary>
/// 获取所有 sockets 的字典集合
/// </summary>
/// <returns></returns>
public ConcurrentDictionary<string, WebSocket> GetAllConnections()
{
return _connections;
}
/// <summary>
/// 获取指定 id 的 socket
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public WebSocket GetSocketById(string id)
{
return _connections.FirstOrDefault(x => x.Key == id).Value;
}
/// <summary>
/// 根据 socket 获取其 id
/// </summary>
/// <param name="socket"></param>
/// <returns></returns>
public string GetId(WebSocket socket)
{
return _connections.FirstOrDefault(x => x.Value == socket).Key;
}
/// <summary>
/// 删除指定 id 的 socket,并关闭该链接
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task RemoveSocketAsync(string id)
{
_connections.TryRemove(id, out var socket);
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "socket connection closed",
CancellationToken.None);
}
/// <summary>
/// 添加一个 socket
/// </summary>
/// <param name="socket"></param>
public void AddSocket(WebSocket socket)
{
_connections.TryAdd(CreateId(), socket);
}
/// <summary>
/// 创建 id
/// </summary>
/// <returns></returns>
private string CreateId()
{
return Guid.NewGuid().ToString("N");
}
}
}
2、创建管理和操作 WebSocket 的基类
该类旨在处理 socket 的连接和断连,以及接收和发送消息,属于基类。
// 文件: SocketsManager/SocketsHandle.cs
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace WebSockets.Test.SocketsManager
{
public abstract class SocketsHandler
{
protected SocketsHandler(SocketsManager sockets)
{
Sockets = sockets;
}
public SocketsManager Sockets {
get;<