2025-03-28 09:49:56 +08:00

66 lines
2.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using System.Web.WebSockets;
//using WebSocket4Net;
namespace TestDemo.Controllers
{
public class MsgApiController : ApiController
{
private static List<WebSocket> _sockets = new List<WebSocket>();
[Route]
[HttpGet]
public HttpResponseMessage Connect()
{
//在服务器端接受Web Socket请求传入的函数作为Web Socket的处理函数待Web Socket建立后该函数会被调用在该函数中可以对Web Socket进行消息收发
HttpContext.Current.AcceptWebSocketRequest(ProcessRequest);
//构造同意切换至Web Socket的Response.
return Request.CreateResponse(HttpStatusCode.SwitchingProtocols);
}
public async Task ProcessRequest(AspNetWebSocketContext context)
{
var socket = context.WebSocket;//传入的context中有当前的web socket对象
_sockets.Add(socket);//此处将web socket对象加入一个静态列表中
//进入一个无限循环当web socket close是循环结束
while (true)
{
var buffer = new ArraySegment<byte>(new byte[1024]);
var receivedResult = await socket.ReceiveAsync(buffer, CancellationToken.None);//对web socket进行异步接收数据
if (receivedResult.MessageType == System.Net.WebSockets.WebSocketMessageType.Close)
{
//如果client发起close请求对client进行ack
await socket.CloseAsync(System.Net.WebSockets.WebSocketCloseStatus.Empty, string.Empty, CancellationToken.None);
_sockets.Remove(socket);
break;
}
if (socket.State == System.Net.WebSockets.WebSocketState.Open)
{
string recvMsg = Encoding.UTF8.GetString(buffer.Array, 0, receivedResult.Count);
var recvBytes = Encoding.UTF8.GetBytes(recvMsg);
var sendBuffer = new ArraySegment<byte>(buffer.Array);
foreach (var innerSocket in _sockets)//当接收到文本消息时对当前服务器上所有web socket连接进行广播
{
if (innerSocket != socket)
{
await innerSocket.SendAsync(sendBuffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
}
}
}
}
}
}