public async Task SendInitialMessages(CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory) { WebSocket webSocket = userWebSocket.WebSocket; var msg = new CustomWebSocketMessage { MessagDateTime = DateTime.Now, Text = $"T{userWebSocket.Id} joined the chat", Username = userWebSocket.Id, Id = Guid.NewGuid(), IsInitialMessage = true, Status = 0 }; wsFactory.AddMessage(msg); var websocketData = new CustomWebSocketData { Messages = wsFactory.GetMessages(), UserNames = wsFactory.GetUserNames() }; var jsonStr = JsonSerializer.Serialize <CustomWebSocketData>(websocketData); byte[] bytes = Encoding.ASCII.GetBytes(jsonStr); await BroadcastToAll(bytes, userWebSocket, wsFactory); }
public async Task Invoke(HttpContext context, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler) { if (!context.WebSockets.IsWebSocketRequest) { await next(context); return; } if (context.Request.Path == "/ws") { //var auth = context.Request.Headers.Where(header => header.Key == "Authorization").FirstOrDefault(); //if (auth.Key == null || string.IsNullOrWhiteSpace(auth.Value)) //{ // context.Response.StatusCode = 401; // return; //} WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(); CustomWebSocket userWebSocket = new CustomWebSocket() { WebSocket = webSocket, SocketId = new Random().Next(100000).ToString() }; wsFactory.Add(userWebSocket); await Listen(context, userWebSocket, wsFactory, wsmHandler); } else { context.Response.StatusCode = 400; return; } }
public async Task Invoke(HttpContext context, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler) { if (context.Request.Path == "/ws") { if (context.WebSockets.IsWebSocketRequest) { string username = context.Request.Query["u"]; if (!string.IsNullOrEmpty(username)) { WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(); CustomWebSocket userWebSocket = new CustomWebSocket(webSocket, username + new Random().Next(0, 100)); wsFactory.Add(userWebSocket); await wsmHandler.HandleNewUserMessage(wsFactory); await Listen(context, userWebSocket, wsFactory, wsmHandler); } } else { context.Response.StatusCode = 400; } } await _next(context); }
public async Task Invoke(HttpContext context, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler) { if (context.Request.Path == "/GetMarket") { if (context.WebSockets.IsWebSocketRequest) { string username = context.Request.Query["u"]; if (!string.IsNullOrEmpty(username)) { WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(); CustomWebSocket userWebSocket = new CustomWebSocket() { WebSocket = webSocket, Username = username }; wsFactory.Add(userWebSocket); await wsmHandler.SendInitialMessages(userWebSocket); await Listen(context, userWebSocket, wsFactory, wsmHandler); } } else { context.Response.StatusCode = 400; } } await _next(context); }
/// <summary> /// 返回信息到用户 /// </summary> /// <param name="buffer"></param> /// <param name="userWebSocket"></param> /// <param name="wsFactory"></param> /// <returns></returns> public async Task BroadcastOthers(byte[] buffer, string username, ICustomWebSocketFactory wsFactory) { var others = wsFactory.Others(username); foreach (var uws in others) { //string msg = Encoding.UTF8.GetString(buffer); //String JSON = msg.Replace("\u0000", ""); //CustomWebSocketMessage message = JSON.ConvertToObject<CustomWebSocketMessage>(); //if (message.Type == WSMessageType.发送) //{ Helperlog4.Info("返回信息到用户" + uws.ConvertToJson() + "&&&&" + Encoding.UTF8.GetString(buffer)); //string serialisedMessage = JsonConvert.SerializeObject(message); //buffer = Encoding.UTF8.GetBytes(serialisedMessage); await uws.WebSocket.SendAsync(new ArraySegment <byte>(buffer, 0, buffer.Length), WebSocketMessageType.Text, true, CancellationToken.None); //} } //var others = wsFactory.Client(userWebSocket.Username); //await others.WebSocket.SendAsync(new ArraySegment<byte>(buffer, 0, buffer.Length), WebSocketMessageType.Text, true, CancellationToken.None); }
public async Task Invoke(HttpContext context, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler) { if (context.Request.Path == "/ws") { if (context.WebSockets.IsWebSocketRequest) { string client = context.Request.Query["u"]; if (!string.IsNullOrEmpty(client) && wsFactory.IsClientUnique(client)) { WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(); CustomWebSocket userWebSocket = new CustomWebSocket() { WebSocket = webSocket, Id = client }; wsFactory.Add(userWebSocket); await Listen(context, userWebSocket, wsFactory, wsmHandler); } } else { context.Response.StatusCode = 400; } } await _next(context); }
public async Task Invoke(HttpContext context, ICustomWebSocketFactory wsFactory, ICustomWebSocketMessageHandler wsmHandler) { if (context.Request.Path == "/ws") { if (context.WebSockets.IsWebSocketRequest) { string groupId = context.Request.Query["g"]; string friendlyName = context.Request.Query["f"]; string userId = context.Request.Query["u"]; if (!string.IsNullOrEmpty(groupId)) { var webSocket = await context.WebSockets.AcceptWebSocketAsync(); var userWebSocket = new CustomWebSocket() { WebSocket = webSocket, GroupId = Guid.Parse(groupId), FriendlyName = friendlyName, UserId = userId, }; wsFactory.Add(userWebSocket); _logger.Log(LogLevel.Information, new EventId((int)LogEventId.User), $"User {userId} joined group {groupId}"); await wsmHandler.SendInitialMessageAsync(userWebSocket, wsFactory); await ListenAsync(context, userWebSocket, wsFactory, wsmHandler); } } else { context.Response.StatusCode = 400; } } await _nextAsync(context); }
public async Task BroadcastAll(byte[] buffer, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory) { var all = wsFactory.All(); foreach (var uws in all) { await uws.WebSocket.SendAsync(new ArraySegment <byte>(buffer, 0, buffer.Length), WebSocketMessageType.Text, true, CancellationToken.None); } }
/// <summary> /// 向指定用户发送消息 /// </summary> /// <param name="factory"></param> /// <param name="userid"></param> /// <param name="data"></param> /// <returns></returns> public async Task SendMessageToUser(ICustomWebSocketFactory factory, string userid, Object data) { var user = factory.Client(userid); if (user != null) { string serialisedMessage = JsonConvert.SerializeObject(data); byte[] bytes = Encoding.UTF8.GetBytes(serialisedMessage); await user.WebSocket.SendAsync(new ArraySegment <byte>(bytes, 0, bytes.Length), WebSocketMessageType.Text, true, CancellationToken.None); } }
/// <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> 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; // 恢复状态 } } }
public async Task SendDisconnectMessageAsync(CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory) { var webSocket = userWebSocket.WebSocket; var msg = new CustomWebSocketMessage { MessageDateTime = DateTime.Now, Type = WebSocketMessageType.Text, Username = userWebSocket.UserId, WebSocketMessageType = "onUserLeave" }; string serialisedMessage = JsonConvert.SerializeObject(msg); byte[] bytes = Encoding.ASCII.GetBytes(serialisedMessage); await BroadcastInGroupAsync(bytes, userWebSocket, wsFactory); }
public async Task HandleMessage(byte[] buffer, ICustomWebSocketFactory wsFactory) { string msg = Encoding.ASCII.GetString(buffer); var message = JsonConvert.DeserializeObject <UserAnswerQuestionSocketMessage>(msg); var all = wsFactory.All(); newQuestionSocketMessage = new NewQuestionSocketMessage { NewQuestion = QuestionService.GetRandomQuestion(), LastQuestionIsAnswerCorrect = message.IsAnswerCorrect, NewQuestionDate = DateTime.Now.AddSeconds(5), Username = message.Username }; string serialisedMessage = JsonConvert.SerializeObject(newQuestionSocketMessage); byte[] bytes = Encoding.UTF8.GetBytes(serialisedMessage); foreach (var uws in all) { await uws.WebSocket.SendAsync(new ArraySegment <byte>(bytes, 0, bytes.Length), WebSocketMessageType.Text, true, CancellationToken.None); } }
public async Task HandleNewUserMessage(ICustomWebSocketFactory wsFactory) { var all = wsFactory.All(); if (all.Count > 1) { var newMsg = new NewQuestionSocketMessage { NewQuestion = QuestionService.GetRandomQuestion(), NewQuestionDate = DateTime.Now, }; string serialisedMessage = JsonConvert.SerializeObject(newMsg); byte[] bytes = Encoding.UTF8.GetBytes(serialisedMessage); foreach (var uws in all) { await uws.WebSocket.SendAsync(new ArraySegment <byte>(bytes, 0, bytes.Length), WebSocketMessageType.Text, true, 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="msg"></param> /// <param name="username"></param> /// <param name="wsFactory"></param> /// <returns></returns> public async Task SendMessage(string msg, string username, ICustomWebSocketFactory wsFactory) { var clients = wsFactory.Clients(username); if (clients != null) { foreach (var client in clients) { if (client.WebSocket.State != WebSocketState.Open) { Log4netHelper.Info(this, "此websocket的状态为:" + client.Username + "<>" + client.WebSocket.State.ToString()); continue; } byte[] buffer = Encoding.UTF8.GetBytes(msg); await client.WebSocket.SendAsync(new ArraySegment <byte>(buffer, 0, buffer.Length), WebSocketMessageType.Text, true, CancellationToken.None); //Log4netHelper.Info(this, client.Username + "-->推送消息成功:" + msg); } } else { Log4netHelper.Info(this, username + "-->客户端不存在!"); } }
/// <summary> /// 返回信息到某类型用户 /// </summary> /// <param name="buffer"></param> /// <param name="usertype"></param> /// <param name="wsFactory"></param> /// <returns></returns> public async Task BroadcastUserTypeOthers(byte[] buffer, UserType usertype, ICustomWebSocketFactory wsFactory) { List <CustomWebSocket> others = wsFactory.All().Where(a => a.UserType == UserType.过账客户端).ToList(); Helperlog4.Info("返回信息到某类型用户,共找到下列用户:" + others.ConvertToJson()); foreach (CustomWebSocket uws in others) { //string msg = Encoding.UTF8.GetString(buffer); //String JSON = msg.Replace("\u0000", ""); //CustomWebSocketMessage message = JSON.ConvertToObject<CustomWebSocketMessage>(); //if (message.Type == WSMessageType.发送) Helperlog4.Info("返回信息到过账客户端:" + uws.Username + " 返回的数据为:" + uws.ConvertToJson() + "&&&&" + Encoding.UTF8.GetString(buffer)); //string serialisedMessage = JsonConvert.SerializeObject(message); //buffer = Encoding.UTF8.GetBytes(serialisedMessage); await uws.WebSocket.SendAsync(new ArraySegment <byte>(buffer, 0, buffer.Length), WebSocketMessageType.Text, true, CancellationToken.None); //} } //var others = wsFactory.Client(userWebSocket.Username); //await others.WebSocket.SendAsync(new ArraySegment<byte>(buffer, 0, buffer.Length), WebSocketMessageType.Text, true, CancellationToken.None); }
public async Task HandleMessage(string msg, byte[] buffer, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory) { try { var message = JsonSerializer.Deserialize <CustomWebSocketMainMessage>(msg); if (message.WSType == WebSocketMessageType.Text) { if (message.Type == "U") { if (wsFactory.AddUser(message.UserName)) { var userMsg = new CustomWebSocketMessage { MessagDateTime = DateTime.Now, Text = $"{message.UserName} joined the chat", Username = message.UserName, Id = Guid.NewGuid(), IsInitialMessage = true, Status = 0 }; wsFactory.AddMessage(userMsg); } else { return; } } else { if (message.Message.Status == 2) { // delete message wsFactory.DeleteMessage(message.Message); } else if (message.Message.Status == 1) { wsFactory.ModifyMessage(message.Message); } else { var newMessage = new CustomWebSocketMessage { Id = Guid.NewGuid(), MessagDateTime = DateTime.Now, Text = message.Message.Text, Username = message.Message.Username, IsInitialMessage = false, Status = 0 }; wsFactory.AddMessage(newMessage); } } var websocketData = new CustomWebSocketData { Messages = wsFactory.GetMessages(), UserNames = wsFactory.GetUserNames() }; var jsonStr = JsonSerializer.Serialize <CustomWebSocketData>(websocketData); byte[] bytes = Encoding.ASCII.GetBytes(jsonStr); await BroadcastToAll(bytes, userWebSocket, wsFactory); } } catch (Exception e) { await userWebSocket.WebSocket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); } }
public async Task HandlerMessage(WebSocketReceiveResult result, byte[] buffer, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory) { string msg = Encoding.ASCII.GetString(buffer); try { var message = JsonConvert.DeserializeObject <CustomWebSocketMessage>(msg); if (message.Type == WSMessageType.AnyType) { await BroadcastOthers(buffer, userWebSocket, wsFactory); } } catch (Exception e) { await userWebSocket.WebSocket.SendAsync(new ArraySegment <byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None); } }
/// <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, IAutomaticPostingFactory apFactory) { string msg = Encoding.UTF8.GetString(buffer); try { //var message = JsonConvert.DeserializeObject<CustomWebSocketMessage>(msg); String JSON = msg.Replace("\0", ""); CustomWebSocketMessage message = JSON.ConvertToObject <CustomWebSocketMessage>(); if (message.Type == EnumModel.WSMessageType.发送 && message.UserType == UserType.挂工艺数据) { message.Text = HelperAspNet.Http.HttpGet("http://172.16.14.250:7031/MesStationMasterMbjGetApi?StationNo=" + message.Username); string serialisedMessage = JsonConvert.SerializeObject(message); Helperlog4.Info("返回吊挂工艺数据" + serialisedMessage); await BroadcastOthers(Encoding.UTF8.GetBytes(serialisedMessage), message.Username, wsFactory); } else if (message.Type == EnumModel.WSMessageType.发送 && message.UserType == UserType.挂模板数据) { message.Text = HelperAspNet.Http.HttpGet("http://172.16.14.250:7030/MesStationMasterAppGetApi?StationNo=" + message.Username); string serialisedMessage = JsonConvert.SerializeObject(message); Helperlog4.Info("返回吊挂吊挂模板数据" + serialisedMessage); await BroadcastOthers(Encoding.UTF8.GetBytes(serialisedMessage), message.Username, wsFactory); } else if (message.Type == EnumModel.WSMessageType.发送 && message.UserType == UserType.过账客户端) { message.Text = apFactory.AutomaticPostingAll().ConvertToJson(); string serialisedMessage = JsonConvert.SerializeObject(message); Helperlog4.Info("发送过账客户端" + serialisedMessage); await BroadcastOthers(Encoding.UTF8.GetBytes(serialisedMessage), message.Username, wsFactory); //await BroadcastUserTypeOthers(Encoding.UTF8.GetBytes(serialisedMessage), UserType.过账客户端, wsFactory); } else if (message.Type == EnumModel.WSMessageType.发送 && message.UserType == UserType.过账数据端) { if (message.Text == "Update") { message.Text = HelperAspNet.Http.HttpGet("http://172.16.1.34:7777/api/GetAutomaticPosting/GetAutomaticPostingAPI"); List <AutomaticPosting> AutomaticPostingList = new List <AutomaticPosting>(); AutomaticPostingList = message.Text.ConvertToList <AutomaticPosting>(); foreach (AutomaticPosting item in AutomaticPostingList) { apFactory.AutomaticPostingAdd(item); } Helperlog4.Info("添加过账数据端" + AutomaticPostingList.ConvertToJson()); } else if (message.Text == "Get") { List <AutomaticPosting> AutomaticPostingList = new List <AutomaticPosting>(); AutomaticPostingList = apFactory.AutomaticPostingAll(); message.Text = AutomaticPostingList.ConvertToJson(); string serialisedMessage = JsonConvert.SerializeObject(message); await BroadcastUserTypeOthers(Encoding.UTF8.GetBytes(serialisedMessage), message.UserType, wsFactory); Helperlog4.Info("过账数据端Get" + serialisedMessage); } } else if (message.Type == EnumModel.WSMessageType.发送 && message.UserType == UserType.过账数据添加端) { List <AutomaticPosting> AutomaticPostingList = new List <AutomaticPosting>(); AutomaticPostingList = message.Text.ConvertToList <AutomaticPosting>(); foreach (AutomaticPosting item in AutomaticPostingList) { apFactory.AutomaticPostingAdd(item); } string serialisedMessage = JsonConvert.SerializeObject(message); Helperlog4.Info("过账数据添加端" + serialisedMessage); await BroadcastUserTypeOthers(Encoding.UTF8.GetBytes(serialisedMessage), UserType.过账客户端, wsFactory); } else if (message.Type == EnumModel.WSMessageType.发送 && message.UserType == UserType.过账数据删除端) { List <AutomaticPosting> AutomaticPostingList = new List <AutomaticPosting>(); AutomaticPostingList = message.Text.ConvertToList <AutomaticPosting>(); foreach (AutomaticPosting item in AutomaticPostingList) { apFactory.AutomaticPostingRemove(item); Helperlog4.Info("过账数据删除端" + message.Username + " 删除服务器内存数据" + JsonConvert.SerializeObject(item)); } string serialisedMessage = JsonConvert.SerializeObject(message); await BroadcastUserTypeOthers(Encoding.UTF8.GetBytes(serialisedMessage), UserType.过账客户端, wsFactory); Helperlog4.Info("过账数据删除端" + message.Username + "给过账客户端返回数据完成!" + serialisedMessage); } else if (message.Type == WSMessageType.登陆) { await userWebSocket.WebSocket.SendAsync(new ArraySegment <byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None); } else if (message.Type == WSMessageType.重连) { // string serialisedMessage = JsonConvert.SerializeObject(message); // await BroadcastOthers(Encoding.UTF8.GetBytes(serialisedMessage), message.Username, wsFactory); } //if (message.Type == WSMessageType.发送 || message.Type == WSMessageType.重连) //{ // string serialisedMessage = JsonConvert.SerializeObject(message); // await BroadcastOthers(Encoding.UTF8.GetBytes(serialisedMessage), message.Username, wsFactory); //} } catch (Exception e) { await userWebSocket.WebSocket.SendAsync(new ArraySegment <byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, 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); }
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); }
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); }
/// <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); } }
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); }
/// <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); }
/// <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 async Task HandleMessageAsync(WebSocketReceiveResult result, IEnumerable <byte> buffer, CustomWebSocket userWebSocket, ICustomWebSocketFactory wsFactory) { var msg = Encoding.ASCII.GetString(buffer.ToArray()).TrimEnd('\0'); try { var incomingMessage = JsonConvert.DeserializeObject <IncomingWebSocketMessageWrapper>(msg); // If serialization succeeds, reset PreviousMessage // Otherwise, we received a partial message, so the following messages on this websocket should have the rest of the message var message = new CustomWebSocketMessage() { MessageDateTime = DateTime.Now, Type = WebSocketMessageType.Text, Username = userWebSocket.UserId, Message = incomingMessage.Message, WebSocketMessageType = incomingMessage.WebSocketMessageType, }; byte[] output = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(message)); await BroadcastInGroupAsync(output, userWebSocket, wsFactory); } catch (Exception ex) { } }