internal GamePacket Build() { return(packetSerializer.Deserialize(array)); }
private async Task <bool> ReceiveDataAsync() { if (!IsReady) { //if (!await CreateAsync()) return(false); } try { var buffer = new byte[4096]; var segment = new ArraySegment <byte>(buffer); var result = await webSocket.ReceiveAsync(segment, CancellationToken.None); if (result.CloseStatus != null || !string.IsNullOrEmpty(result.CloseStatusDescription)) { Disconnect(); return(false); } if (!result.EndOfMessage) { if (unfinishedPacket == null) { unfinishedPacket = new PartialGamePacket( packetSerializer, segment.Array, result.Count); } else { unfinishedPacket.Append(segment.Array, result.Count); } } else { try { GamePacket packet = null; if (unfinishedPacket != null) { packet = unfinishedPacket.Build(); unfinishedPacket = null; } else { packet = packetSerializer.Deserialize(segment.Array, result.Count); } if (awaitedReplies.TryGetValue(packet.CorrelationId, out var task)) { if (task.TrySetResult(packet)) { return(true); } } await HandlePacketAsync(packet); } catch (Exception exc) { Debug.LogError("Error deserializing packet: " + exc); } } return(true); } //catch (System.IO.IOException exc) //{ // logger.Error(exc.ToString()); // this.Disconnect(); // return false; //} catch (WebSocketException socketExc) { if (socketExc.WebSocketErrorCode != WebSocketError.ConnectionClosedPrematurely) { logger.Error(socketExc.ToString()); } gameManager.ForceGameSessionUpdate(); Disconnect(); return(false); } catch (Exception exc) { logger.Error(exc.ToString()); Disconnect(); return(false); } }
public GamePacket Build() { return(packetSerializer.Deserialize(this.array)); }
private async Task <bool> ReceiveDataAsync() { if (!IsReady) { //if (!await CreateAsync()) return(false); } try { var buffer = new byte[4096]; var segment = new ArraySegment <byte>(buffer); var result = await this.webSocket.ReceiveAsync(segment, CancellationToken.None); if (result.CloseStatus != null || !string.IsNullOrEmpty(result.CloseStatusDescription)) { this.Disconnect(); return(false); } if (!result.EndOfMessage) { if (unfinishedPacket == null) { unfinishedPacket = new PartialGamePacket( packetSerializer, segment.Array, result.Count); } else { unfinishedPacket.Append(segment.Array, result.Count); } } else { GamePacket packet = null; if (unfinishedPacket != null) { packet = unfinishedPacket.Build(); unfinishedPacket = null; } else { packet = packetSerializer.Deserialize(segment.Array, result.Count); } if (awaitedReplies.TryGetValue(packet.CorrelationId, out var task)) { if (task.TrySetResult(packet)) { return(true); } } await HandlePacketAsync(packet); } return(true); } catch (Exception exc) { logger.Error(exc.ToString()); if (this.webSocket.State == WebSocketState.Aborted) { this.Disconnect(); } return(false); } }