Beispiel #1
0
        /// <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);
            }
        }
Beispiel #2
0
        /// <summary>
        /// 受信データを初期化します。
        /// </summary>
        private void InitReceivedPacket()
        {
            this.headerStream = new MemoryStream(PbPacketHeader.HeaderLength);

            this.packetHeader   = null;
            this.typenameStream = null;
            this.payloadStream  = null;
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
        /// <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);
            }
        }