/// <summary> /// 广播消息给所有的客户端 /// </summary> /// <param name="buffer"></param> /// <param name="userWebSocket"></param> /// <param name="wsFactory"></param> /// <returns></returns> public async Task BroadcastAll(byte[] buffer, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory) { var all = wsFactory.All(); foreach (var uws in all) { if (uws.WebSocket.State != WebSocketState.Open) { Log4netHelper.Info(this, "此websocket的状态为:" + uws.Username + "<>" + uws.WebSocket.State.ToString()); continue; } await uws.WebSocket.SendAsync(new ArraySegment <byte>(buffer, 0, buffer.Length), WebSocketMessageType.Text, true, CancellationToken.None); } }
/// <summary> /// 发送消息给指定的客户端 /// </summary> /// <param name="msg"></param> /// <param name="userWebSocket"></param> /// <param name="wsFactory"></param> /// <returns></returns> public async Task SendMessageToSingle(string msg, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory) { byte[] buffer = Encoding.UTF8.GetBytes(msg); var client = wsFactory.Client(userWebSocket); if (client != null) { if (client.WebSocket.State != WebSocketState.Open) { Log4netHelper.Info(this, "此websocket的状态为:" + client.Username + "<>" + client.WebSocket.State.ToString()); return; } await client.WebSocket.SendAsync(new ArraySegment <byte>(buffer, 0, buffer.Length), WebSocketMessageType.Text, true, CancellationToken.None); } }
/// <summary> /// 发送链接成功消息给客户端 /// </summary> /// <param name="userWebSocket"></param> /// <returns></returns> public async Task SendInitialMessages(CustomWebSocket userWebSocket) { WebSocket webSocket = userWebSocket.WebSocket; var msg = new CustomWebSocketMessage { MessagDateTime = DateTime.Now, Type = userWebSocket.token, Text = "socket连接成功!", Username = userWebSocket.Username, }; string serialisedMessage = JsonConvert.SerializeObject(msg); byte[] bytes = Encoding.UTF8.GetBytes(serialisedMessage); await webSocket.SendAsync(new ArraySegment <byte>(bytes, 0, bytes.Length), WebSocketMessageType.Text, true, CancellationToken.None); }
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); //Log4netHelper.Info(this, "websokct关闭,移除用户为:" + userWebSocket.Username); await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); }
public async Task Invoke(HttpContext context, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler) { if (context.Request.Path == "/ws") { if (context.Request.Headers.ContainsKey("Sec-WebSocket-Protocol")) { context.Response.Headers.Add("Sec-WebSocket-Protocol", "protocol1"); } if (context.WebSockets.IsWebSocketRequest) { string username = context.Request.Query["u"]; string token = context.Request.Query["token"]; //Log4netHelper.Info(this, "websokct进入,用户为:" + username); if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(token) && token.Length == 36) { WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(); CustomWebSocket userWebSocket = new CustomWebSocket() { WebSocket = webSocket, Username = username, token = token }; wsFactory.Add(userWebSocket); wsFactory.RemoveInvalid(); await wsmHandler.SendInitialMessages(userWebSocket); await Listen(context, userWebSocket, wsFactory, wsmHandler); } } else { context.Response.StatusCode = 400; //Log4netHelper.Info(this, "不是websocket请求!"); } } else { await _next(context); } }
/// <summary> /// 处理收到的客户端消息 /// </summary> /// <param name="result"></param> /// <param name="buffer"></param> /// <param name="userWebSocket"></param> /// <param name="wsFactory"></param> /// <returns></returns> public async Task HandleMessage(WebSocketReceiveResult result, byte[] buffer, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory) { string msg = Encoding.UTF8.GetString(buffer, 0, result.Count); try { if (msg.Equals("ping")) //心跳监测 { //Log4netHelper.Error(this, "HandleMessage:心跳监测:" + msg); byte[] buffer1 = Encoding.UTF8.GetBytes(msg); await userWebSocket.WebSocket.SendAsync(new ArraySegment <byte>(buffer1, 0, buffer1.Length), WebSocketMessageType.Text, true, CancellationToken.None); } else { //Log4netHelper.Error(this, "HandleMessage:" + msg); //var message = JsonConvert.DeserializeObject<CustomWebSocketMessage>(msg); //if (message.Type == "test") //{ // await BroadcastOthers(buffer, userWebSocket, wsFactory); //} } } catch (Exception ex) { Log4netHelper.Error(this, ex); await userWebSocket.WebSocket.SendAsync(new ArraySegment <byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None); } }
public void Remove(CustomWebSocket curclient) { var client = List.First(p => p.Username.Equals(curclient.Username) && p.token.Equals(curclient.token)); List.Remove(client); }
public CustomWebSocket Client(CustomWebSocket client) { return(List.First(p => p.Username.Equals(client.Username) && p.token.Equals(client.token))); }
public List <CustomWebSocket> Others(CustomWebSocket client) { return(List.Where(c => c.Username != client.Username && c.token != client.token).ToList()); }
public void Add(CustomWebSocket uws) { List.Add(uws); }