/// <summary> /// 受信パケットを処理します。 /// </summary> private void HandleReceivedPacket(PbPacketHeader header, byte[] typenameBuffer, byte[] payloadBuffer) { Type type = null; try { // 型名とメッセージをデシリアライズします。 type = DeserializeType(typenameBuffer); var message = DeserializeMessage(payloadBuffer, type); // 対応するハンドラを呼びます。 if (!header.IsResponse) { HandleRequestOrCommand(header.Id, message); } else { HandleResponse(header.Id, message); } } catch (Exception ex) { Log.ErrorException(this, ex, "データのデシリアライズに失敗しました。" + "(content size={0}, type={1})", (payloadBuffer == null ? -1 : payloadBuffer.Length), type); } }
/// <summary> /// 受信データを初期化します。 /// </summary> private void InitReceivedPacket() { this.headerStream = new MemoryStream(PbPacketHeader.HeaderLength); this.packetHeader = null; this.typenameStream = null; this.payloadStream = null; }
/// <summary> /// ヘッダー受信完了後に呼ばれます。 /// </summary> private void PacketHeaderReceived() { var header = new PbPacketHeader(); header.SetDecodedHeader(this.headerStream.GetBuffer()); // 10MB以上のデータはエラーとします。 if (header.PayloadLength > 10 * 1024 * 1024) { Disconnect(); return; } this.packetHeader = header; this.typenameStream = new MemoryStream(header.TypeNameLength); this.payloadStream = new MemoryStream(header.PayloadLength); Log.Trace(this, "Packet Header Received (payload={0}bytes)", header.PayloadLength); }
/// <summary> /// データを送信します。 /// </summary> private void SendDataInternal(int id, bool isResponse, PbSendData pbSendData, bool isOutLog) { if (pbSendData == null) { throw new ArgumentNullException("pbSendData"); } if (pbSendData.SerializedData == null || pbSendData.EncodedTypeName == null) { throw new PbException("送信データがシリアライズされていません。"); } try { if (!IsConnected || !CanWrite) { // これをthrowすると対処が面倒なので return; } var typedata = pbSendData.EncodedTypeData; var payload = pbSendData.SerializedData; // パケットヘッダを用意します。 var header = new PbPacketHeader { Id = id, IsResponse = isResponse, TypeNameLength = typedata.Length, PayloadLength = payload.Length, }; var headerData = header.GetEncodedPacket(); // 送信データは複数バッファのまま送信します。 var sendData = new SendData() { Socket = this.Socket, }; sendData.AddBuffer(headerData); sendData.AddBuffer(typedata); sendData.AddBuffer(payload); // データを送信します。 base.SendData(sendData); if (isOutLog) { Log.Debug(this, "{0}を送信しました。(content={1}bytes)", pbSendData.TypeName, (payload != null ? payload.Length : -1)); } } catch (Exception ex) { Log.ErrorException(this, ex, "{0}: 送信データのシリアライズに失敗しました。", pbSendData.TypeName); } }