/// <summary> /// 发送消息 /// </summary> /// <param name="message">消息对象</param> /// <param name="messageType">消息类型</param> /// <param name="endOfMessage">是否结束消息</param> /// <returns></returns> public async Task <bool> SendAsync(WSMessageHelper message, WebSocketMessageType messageType, bool endOfMessage) { var buffer1 = Encoding.Default.GetBytes(JsonConvert.SerializeObject(message)); var outgoing = new ArraySegment <byte>(buffer1, 0, buffer1.Length); WebSocket socket = null; if (_socketConnectUsers.TryGetValue(message.ReceiverId, out socket)) { await socket.SendAsync(outgoing, messageType, endOfMessage, CancellationToken.None); return(true); } return(false); }
async Task EchoLoop() { var buffer = new byte[1024 * 4]; WebSocketReceiveResult result = await this.socket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); if (_socketConnectUsers == null) { _socketConnectUsers = new ConcurrentDictionary <string, WebSocket>(); } if (!result.CloseStatus.HasValue)//第一次连接 { WSMessageHelper OneModel = null; try { OneModel = JsonConvert.DeserializeObject <WSMessageHelper>(ReceiveString(buffer, result)); _sockSenderId = OneModel.SenderId; } catch (Exception) { } if (string.IsNullOrEmpty(_sockSenderId)) { _sockSenderId = Guid.NewGuid().ToString(); } if (_socketConnectUsers.TryAdd(_sockSenderId, socket)) { await SendAsync(new WSMessageHelper {//连接成功时返回用户id SenderId = "Service", ReceiverId = _sockSenderId, MessageType = "text", Content = "open" }, WebSocketMessageType.Text, result.EndOfMessage); } } while (!result.CloseStatus.HasValue) { string sendMsg = ReceiveString(buffer, result); WSMessageHelper wSMessage = null; if (!string.IsNullOrWhiteSpace(sendMsg)) { try { wSMessage = JsonConvert.DeserializeObject <WSMessageHelper>(sendMsg); } catch (Exception) { wSMessage = new WSMessageHelper //,失败时回发用户消息 { SenderId = "Service", ReceiverId = _sockSenderId, MessageType = "text", Content = sendMsg }; } } if (wSMessage != null && !string.IsNullOrWhiteSpace(wSMessage.ReceiverId) && !wSMessage.ReceiverId.ToLower().Equals("service")) { if (!await SendAsync(wSMessage, WebSocketMessageType.Text, true)) //false表示发送失败 { await SendAsync(new WSMessageHelper //,失败时回发用户消息 { SenderId = "Service", ReceiverId = _sockSenderId, MessageType = "text", Content = "消息发送不成功,用户已下线" }, WebSocketMessageType.Text, result.EndOfMessage); } } result = await this.socket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } _socketConnectUsers.TryRemove(_sockSenderId, out socket); await this.socket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); }