Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        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);
        }