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(); } }
/// <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())); } }
/// <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 } }
/// <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 } }
/// <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 } }
/// <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 } }
/// <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())); } } }
public void SetPlayItem(string message) { SocketMessage decoded = SocketMessage.Deserialize(message); SetPlayItem(decoded); }