背景:需要开发一个WebSocket服务端,用来向h5客户端推送消息;以前的做法是直接做一个windows服务,专门开一个端口来进行WebSocket连接,现在可以在.net5 WebAPI中直接支持WebSocket,且不用单开端口
使用步骤:
1.在Startup.cs的Configure中启用WebSocket中间件
?app.UseWebSockets();
2.在控制器中添加Action,来接收WebSocket客户端的连接和处理接收、发送消息,关闭连接;
[HttpGet("/ws")]
public async Task Get()
{
if (HttpContext.WebSockets.IsWebSocketRequest)
{
//接受websocket客户端连接
using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
await Echo(webSocket);
}
else
{
//不是websocket客户端请求
HttpContext.Response.StatusCode = 400;//
}
}
/// <summary>
/// 对客户端的处理,接受消息,发送消息,关闭连接
/// </summary>
/// <param name="webSocket"></param>
/// <returns></returns>
private async Task Echo(WebSocket webSocket)
{
var buffer = new byte[1024 * 4];
var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
while (!result.CloseStatus.HasValue)
{
var serverMsg = Encoding.UTF8.GetBytes($"Server: Hello. You said: {Encoding.UTF8.GetString(buffer)}");
//向客户端发送消息
await webSocket.SendAsync(new ArraySegment<byte>(serverMsg, 0, serverMsg.Length), result.MessageType, result.EndOfMessage, CancellationToken.None);
//继续接受客户端消息
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
}
//关闭释放与客户端连接
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}
3.具体可以按照自己的业务来做,比如存储一个客户端字典来维护,指定客户端进行发送消息。
4.H5上操作就是这样:
let ws = new WebSocket('ws://api.zhandian.com/ws');//连接的就是api网站的地址
ws.onmessage = function (e) {
//监听消息
console.log(e);
console.log(e.data);
};
当然我现在websocket客户端不多,还不知道客户端多的话,这样会不会影响api接口,等待验证
|