Exemplo n.º 1
0
 public void AddBytes(byte[] toadd)
 {
     foreach (byte t in toadd)
     {
         if (_messageSize == -1)
         {
             _messageSizeBuffer[_msbAdded] = t;
             _msbAdded++;
         }
         else
         {
             _messageBuffer[_mbAdded] = t;
             _mbAdded++;
         }
         if (_msbAdded == 8 && _messageSize == -1)
         {
             _messageSize   = (int)BitConverter.ToInt64(_messageSizeBuffer, 0);
             _messageBuffer = new byte[_messageSize];
             continue;
         }
         if (_mbAdded != _messageSize)
         {
             continue;
         }
         SocketMessage sm = SocketMessage.Deserialize(_messageBuffer);
         if (sm != null)
         {
             SmQueue.Enqueue(sm);
         }
         Restart();
     }
 }
Exemplo n.º 2
0
        /// <summary>
        /// Ожидание входящих сообщений через клиентский WebSocket
        /// </summary>
        /// <param name="clientSocket">Тот WebSocket, который ожидает входящих сообщений</param>
        private async void WaitIncomeMessageAsync(WebSocket clientSocket)
        {
            while (clientSocket.State == WebSocketState.Open)
            {
                ArraySegment <byte>    buffer = new ArraySegment <byte>(new byte[0x1000]);
                WebSocketReceiveResult receive;
                try
                {
                    // Точка ожидания входящих сообщений
                    receive = await clientSocket.ReceiveAsync(buffer, cancelWaitToken.Token);
                }
                catch (Exception ex)
                {
                    // Обработка ошибок работы WebSocket

                    if (ex is WebSocketException webEx)
                    {
                        if (webEx.HResult == -2147467259 &&
                            webEx.InnerException != null &&
                            webEx.InnerException.HResult == -2147467259)
                        {
                            // Один  из игроков вышел. Удаляем его из списка
                            playerList.DeleteFreeSocket();

                            // Если ни одного игрока не осталось, закрываем текущую игру
                            TestForEmptyPlayerList();

                            // Отображение изменившегося списка игроков
                            ShowPlayerList(playerList.GetPlayerList());
                            continue;
                        }
                    }

                    if (!cancelWaitToken.IsCancellationRequested)
                    {
                        // Если исключение вызвано не остановкой работы, показываем сообщение об ошибке
                        ShowError(ex.AllMessages());
                    }

                    // Работа прервана посредством cancelToken. Просто выход из цикла и метода.
                    return;
                }

                if (receive.MessageType == WebSocketMessageType.Close)
                {
                    // При закрытии WebSocket прекращаем его прослушивание.
                    return;
                }

                // Все сообщения в рамках игры передаются в сериализованном при помощи BinaryFormatter виде, то есть сообщение не бинарного вида нас не интересует.
                if (receive.MessageType != WebSocketMessageType.Binary)
                {
                    // Просто не обрабатываем запросы, не относящиеся к судоку
                    continue;
                }

                // Обработка пришедшего сообщения
                await ProcessingMessage(clientSocket, SocketMessage.Deserialize(buffer.ToArray()));
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Auth response
        /// </summary>
        /// <param name="msg">Socket message</param>
        public void Auth(string msg)
        {
            SocketMessage message = SocketMessage.Deserialize(msg);

            try
            {
                onAuth(message.message);
            }
            catch (Exception ex)
            {
                //no binding listerners
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Recieve track response
        /// </summary>
        /// <param name="msg">Socket message</param>
        public async void Track(string msg)
        {
            SocketMessage message = SocketMessage.Deserialize(msg);

            try
            {
                onTrack(await message.GetStream(), message.contentType);
            }
            catch (Exception ex)
            {
                //no binding listerners
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Recieved devices list event
        /// </summary>
        /// <param name="msg">Socket message</param>
        public void Devices(string msg)
        {
            SocketMessage message = SocketMessage.Deserialize(msg);

            try
            {
                onDevices(message.devices);
            }
            catch (Exception ex)
            {
                //no binding listerners
            }
        }
Exemplo n.º 6
0
        /// <summary>
        /// Get track event
        /// </summary>
        /// <param name="msg">Socket message</param>
        public void GetTrack(string msg)
        {
            SocketMessage message = SocketMessage.Deserialize(msg);

            try
            {
                onGetTrack(message.alias, message.deviceId.Value);
            }
            catch (Exception ex)
            {
                //no binding listerners
            }
        }
Exemplo n.º 7
0
        /// <summary>
        /// Приём приходящих с WebSocket-сервера сообщений
        /// </summary>
        private async void ListenAsync()
        {
            // Буфер для принимаемого сообщения
            byte[] msgBytes            = new byte[0x1000];
            ArraySegment <byte> arrSeg = new ArraySegment <byte>(msgBytes);

            // Экземпляр класса для приёма сообщения
            WebSocketReceiveResult result;

            while (true)
            {
                try
                {
                    // В этой точке происходит рпиём собщения с WebSocket-сервера
                    result = await clientSocket.ReceiveAsync(arrSeg, cancelToken.Token);
                }
                catch (Exception ex)
                {
                    if (!cancelToken.Token.IsCancellationRequested)
                    {
                        // В случае ошибки при приёме, сообщаем об этом пользователю, если только это не запрошенное им самим закрытие соединения с WebSocket-сервером
                        visual.ShowError(ex);
                    }

                    // Заканчиваем ожидание входящих сообщений
                    return;
                }

                using (MemoryStream stream = new MemoryStream())
                {
                    // Перенос принятого сообщения в MemoryStream
                    stream.Write(arrSeg.Array, 0, result.Count);

                    // Десериализация сообщения и передача его на обработку
                    ProcessingMessage(SocketMessage.Deserialize(stream.ToArray()));
                }
            }
        }
Exemplo n.º 8
0
        public void SetPlayItem(string message)
        {
            SocketMessage decoded = SocketMessage.Deserialize(message);

            SetPlayItem(decoded);
        }