Пример #1
0
 /// <summary>
 /// Close client websocket
 /// </summary>
 /// <param name="context"></param>
 /// <param name="msg"></param>
 private async Task Disconnect(Constants.WEBSOCKET_STATUS status)
 {
     if (socket.State == WebSocketState.CloseReceived)
     {
         //await ProcessSendBroadCast(userData.token + " disconnect");
         //context.WebSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure,
         //    msg, CancellationToken.None).Wait();
         LIST_CLIENT.Remove(key);
         await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, status.ToString(), CancellationToken.None);
     }
 }
Пример #2
0
        public async Task Receiver(AspNetWebSocketContext context)
        {
            try
            {
                socket = context.WebSocket as AspNetWebSocket;
                key    = context.SecWebSocketKey;
                #region ADD CLIENT
                if (LIST_CLIENT == null)
                {
                    LIST_CLIENT    = new Dictionary <string, AspNetWebSocketContext>();
                    LIST_MAP_TOKEN = new Dictionary <string, string>();
                }
                LIST_CLIENT.Add(key, context);
                LIST_MAP_TOKEN.Add(key, userData.token);

                //if (!LIST_CLIENT.ContainsKey(userData.token))
                //{
                //    LIST_CLIENT.Add(key, context);
                //    LIST_MAP_TOKEN.Add(key, userData.token);
                //}
                //else
                //{
                //    //var client = LIST_CLIENT[userData.token];
                //    //client = context;
                //    //var clientKey = LIST_MAP_TOKEN.SingleOrDefault(x => x.Value == userData.token).Key;
                //    //if(clientKey != null)
                //    //    LIST_MAP_TOKEN.Remove(clientKey);
                //    //LIST_MAP_TOKEN.Add(key, userData.token);
                //}
                if (!string.IsNullOrEmpty(userData.tokenOld))
                {
                    var listTokenOld = LIST_MAP_TOKEN.Where(x => x.Value == userData.tokenOld);
                    foreach (var item in listTokenOld)
                    {
                        await KickUser(item.Key, Constants.WEBSOCKET_STATUS.KICK_USER);
                    }
                }
                #endregion
                init();
                while (socket.State == WebSocketState.Open)
                {
                    await ProcessSendDataPacket();
                    await ProcessSendBroadCast();

                    while (ListDataSend.Count > 0)
                    {
                        await SendMessage(ListDataSend[0]);

                        ListDataSend.RemoveAt(0);
                    }
                    WebSocketReceiveResult receiveResult = await socket.ReceiveAsync(new ArraySegment <byte>(receiveBuffer), CancellationToken.None);

                    //disconnect client
                    if (receiveResult.MessageType == WebSocketMessageType.Close)
                    {
                        LIST_MAP_TOKEN.Remove(key);
                        await Disconnect(Constants.WEBSOCKET_STATUS.DISCONNECT_CLIENT);

                        //await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
                    }
                    else if (receiveResult.MessageType == WebSocketMessageType.Binary)
                    {
                        await socket.CloseAsync(WebSocketCloseStatus.InvalidMessageType, "Cannot accept binary frame", CancellationToken.None);
                    }
                    else
                    {
                        int count = receiveResult.Count;

                        while (receiveResult.EndOfMessage == false)
                        {
                            if (count >= maxMessageSize)
                            {
                                await Disconnect(Constants.WEBSOCKET_STATUS.DISCONNECT_SERVER);

                                return;
                            }
                            receiveResult = await socket.ReceiveAsync(new ArraySegment <byte>(receiveBuffer, count, maxMessageSize - count), CancellationToken.None);

                            count += receiveResult.Count;
                        }
                        var receivedString = Encoding.UTF8.GetString(receiveBuffer, 0, count);
                        ProcessByDataPacket(receivedString);
                    }
                }
            }
            catch (Exception ex)
            {
                WriteLog("ERROR WEBSOCKET", ex);
                await Disconnect(Constants.WEBSOCKET_STATUS.DISCONNECT_SERVER);

                return;
            }
        }