/// <summary> /// 心跳类 /// </summary> public async Task Invoke(string Username, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler) { while (true) { try { System.Threading.Thread.Sleep(1000); List <CustomWebSocket> CustomWebSocketList = new List <CustomWebSocket>(); CustomWebSocketList = wsFactory.Others(Username); foreach (CustomWebSocket item in CustomWebSocketList) { if (item.WebSocket.State == WebSocketState.Aborted || item.WebSocket.State == WebSocketState.Closed) { wsFactory.Remove(item.Username); ClientWebSocket _webSocket = new ClientWebSocket(); CustomWebSocket userWebSocket = new CustomWebSocket() { WebSocket = _webSocket, Username = item.Username, UseSid = item.UseSid, Url = item.Url }; wsFactory.Add(userWebSocket); await wsmHandler.SendInitialMessages(userWebSocket); //await Listen(context, userWebSocket, wsFactory, wsmHandler); } } } catch (WebSocketException e) { // 产生 10035 == WSAEWOULDBLOCK 错误,说明被阻止了,但是还是连接的 //if (e.NativeErrorCode.Equals(10035)) //{ // return true; //} //else //{ // return false; //} } finally { //socket.Blocking = blockingState; // 恢复状态 } } }
private async Task Listen(HttpContext context, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler) { WebSocket webSocket = userWebSocket.WebSocket; var buffer = new byte[1024 * 4]; WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); while (!result.CloseStatus.HasValue) { await wsmHandler.HandleMessage(result, buffer, userWebSocket, wsFactory); buffer = new byte[1024 * 4]; result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } wsFactory.Remove(userWebSocket.Username); await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); }
private async Task Listen(HttpContext context, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler) { //await wsmHandler.SendInitialMessages(userWebSocket); WebSocket webSocket = userWebSocket.WebSocket; var buffer = new byte[1024 * 4]; WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); while (!result.CloseStatus.HasValue) { //await wsmHandler.HandleMessage(result, buffer, userWebSocket, wsFactory); //await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None); await wsmHandler.SendInitialMessages(userWebSocket); result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } wsFactory.Remove(userWebSocket.SocketId); await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); }
private async Task Listen(HttpContext context, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler) { WebSocket webSocket = userWebSocket.WebSocket; using IMemoryOwner <byte> memory = MemoryPool <byte> .Shared.Rent(1024 * 4); var buffer = new byte[1024 * 4]; WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); while (!result.CloseStatus.HasValue) { string msg = Encoding.UTF8.GetString(buffer, 0, result.Count); await wsmHandler.HandleMessage(msg, buffer, userWebSocket, wsFactory); buffer = new byte[1024 * 4]; result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } wsFactory.Remove(userWebSocket.Id); await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); }
private async Task ListenAsync(HttpContext context, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler) { var webSocket = userWebSocket.WebSocket; byte[] buffer = new byte[1024 * 16]; var message = new List <byte>(); WebSocketReceiveResult response; do { do { response = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); message.AddRange(new ArraySegment <byte>(buffer, 0, response.Count)); } while (!response.EndOfMessage); await wsmHandler.HandleMessageAsync(response, message, userWebSocket, wsFactory); } while (!response.CloseStatus.HasValue); await wsmHandler.SendDisconnectMessageAsync(userWebSocket, wsFactory); wsFactory.Remove(userWebSocket.GroupId, userWebSocket.UserId); await webSocket.CloseAsync(response.CloseStatus.Value, response.CloseStatusDescription, CancellationToken.None); }
/// <summary> /// 连接 /// </summary> /// <param name="context"></param> /// <param name="wsFactory"></param> /// <param name="wsmHandler"></param> /// <returns></returns> public async Task Invoke(HttpContext context, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler, IAutomaticPostingFactory apFactory) { if (context.Request.Path == "/MesServiceStation") { Helperlog4.Info("新连接完成" + context.Request.Path.ToString()); if (context.WebSockets.IsWebSocketRequest) { System.Security.Principal.WindowsIdentity currentUser = System.Security.Principal.WindowsIdentity.GetCurrent(); string usesid = currentUser.User.ToString(); string customwebsocketS = context.Request.Query["username"]; //string username = usesid + "------Name"; if (!string.IsNullOrEmpty(customwebsocketS)) { CustomWebSocket customwebsocket = customwebsocketS.ConvertToObject <CustomWebSocket>(); WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(); List <CustomWebSocket> CustomWebSocketList = new List <CustomWebSocket>(); CustomWebSocketList = wsFactory.Others(customwebsocket.Username); if (CustomWebSocketList.Count > 0) { CustomWebSocket userWebSocket1 = new CustomWebSocket(); userWebSocket1 = CustomWebSocketList[0]; wsFactory.Remove(userWebSocket1.Username); CustomWebSocket userWebSocket = new CustomWebSocket() { WebSocket = webSocket, Username = userWebSocket1.Username, UseSid = usesid, Url = context.Request.GetDisplayUrl(), UserType = userWebSocket1.UserType }; wsFactory.Add(userWebSocket); //await Heartbeat(wsFactory, wsmHandler); Helperlog4.Info("重新连接返回值" + userWebSocket.ConvertToJson()); await wsmHandler.SendInitialMessages(userWebSocket); await Listen(context, userWebSocket, wsFactory, wsmHandler, apFactory); } else { CustomWebSocket userWebSocket = new CustomWebSocket() { WebSocket = webSocket, Username = customwebsocket.Username, UseSid = usesid, Url = context.Request.GetDisplayUrl(), UserType = customwebsocket.UserType }; wsFactory.Add(userWebSocket); Helperlog4.Info("新连接返回值" + userWebSocket.ConvertToJson()); //await Heartbeat(wsFactory, wsmHandler); await wsmHandler.SendInitialMessages(userWebSocket); await Listen(context, userWebSocket, wsFactory, wsmHandler, apFactory); } } } else { context.Response.StatusCode = 400; } } await _next(context); }