SignalRDemo/Controllers/HomeController.cs

77 lines
2.9 KiB
C#
Raw Permalink 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 SignalRChat.Models;
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;
namespace SignalRChat.Controllers
{
//访问 wss://localhost:44303/api/Home/connect
//控制台
//let webSocket = new WebSocket('wss://localhost:44303/api/Home/connect');
//webSocket.send("hello world");
//webSocket.close();
[RoutePrefix("api/Home")]
public class HomeController : ApiController
{
private static List<WebSocket> _socket = new List<WebSocket>();
[HttpGet]
[Route("connect")]
[AllowAnonymous]
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对象
_socket.Add(socket);//此处将web socket对象加入一个静态列表中
//进入一个无限循环,当web socket close是循环结束
while (true)
{
var buffer = new ArraySegment<byte>(new byte[1024]);
var receviedResult = await socket.ReceiveAsync(buffer, CancellationToken.None);//对web socket进行异步接收数据
if (receviedResult.MessageType == WebSocketMessageType.Close)
{
await socket.CloseAsync(WebSocketCloseStatus.Empty, string.Empty, CancellationToken.None);//如果client发起close请求,对client进行ack
_socket.Remove(socket);
break;
}
if (socket.State == WebSocketState.Open)
{
string recvMsg = Encoding.UTF8.GetString(buffer.Array, 0, receviedResult.Count);
var recvBytes = Encoding.UTF8.GetBytes(recvMsg);
var sendBuffer = new ArraySegment<byte>(recvBytes);
foreach (var innerSocket in _socket)//当接收到文本消息时对当前服务器上所有web socket链接进行广播
{
if (innerSocket == socket)
{
await innerSocket.SendAsync(sendBuffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
}
}
}
}
}
}