コード例 #1
0
        public override void OnMessage()
        {
            int defineHeadSize = sizeof(int);

            do
            {
                if (ListByteBuffer.Count < defineHeadSize)
                {
                    return;
                }

                byte[] lenBytes   = ListByteBuffer.GetRange(0, defineHeadSize).ToArray();
                int    packageLen = BitConverter.ToInt32(lenBytes, 0);

                if (packageLen > ListByteBuffer.Count + defineHeadSize)
                {
                    return;
                }

                byte[] data = ListByteBuffer.GetRange(defineHeadSize, packageLen).ToArray();

                this.MessageHandler(data);
                ListByteBuffer.RemoveRange(0, packageLen + defineHeadSize);
            } while (ListByteBuffer.Count > defineHeadSize);
        }
 public override void OnMessage()
 {
     if (ListByteBuffer.Count > 0)
     {
         this._targetConnection.SendTo(ListByteBuffer.ToArray());
         ListByteBuffer.Clear();
     }
 }
コード例 #3
0
        public override void OnMessage()
        {
            var defineHeadSize = sizeof(int);

            if (ListByteBuffer.Count < defineHeadSize)
            {
                return;
            }

            byte[] lenBytes   = ListByteBuffer.GetRange(0, defineHeadSize).ToArray();
            int    packageLen = BitConverter.ToInt32(lenBytes, 0);

            if (packageLen < 0 || packageLen > ApplicationConfiguartion.Options.MaxPacketSize || packageLen < 25) //数据不合法 或 小于大概ack固定长度
            {
                this.Log(LogOutLevelType.Error, $"Type:{ConnectionWorkType.ToString()} 长度不合法!");
                this.CloseSession();
                return;
            }

            if (packageLen + defineHeadSize > ListByteBuffer.Count)
            {
                return;
            }

            this._ackRetainData = ListByteBuffer.GetRange(defineHeadSize, packageLen).ToArray();
            ListByteBuffer.RemoveRange(0, packageLen + defineHeadSize);

            var longSize    = sizeof(long);
            var packageBody = GZipHelper.Decompress(_ackRetainData, longSize, _ackRetainData.Length - longSize);
            var messageHead = TakeMessageHead(packageBody);

            if (messageHead == ACK_HEAD)
            {
                var ack = PacketSerializeHelper.DeserializePacket <AckPacket>(TakeMessage(packageBody));

                this._accessId = ack.AccessId;

                if (ValidityAccessIdWithKey((ConnectionWorkType)ack.Type, ack.AccessId, ack.AccessKey))
                {
                    this.ApportionTypeHandlerEvent?.Invoke(this, (ConnectionWorkType)ack.Type);
                }
                else
                {
                    if ((ConnectionWorkType)ack.Type == ConnectionWorkType.MainApplicationConnection)
                    {
                        var midData = MessageHelper.CopyMessageHeadTo(MessageHead.MID_ACCESS_KEY_WRONG);
                        this.CurrentSession.SendAsync(midData.BuilderHeadPacket());
                    }
                    this.Log(LogOutLevelType.Debug, $"Type:{((ConnectionWorkType)ack.Type).ToString()} AccessId:{ack.AccessId} 或AccessKey:{ack.AccessKey} 验证失败,登陆不成功!");
                    this.CloseSession();
                }
            }
            else
            {
                this.CloseSession();
                this.Log(LogOutLevelType.Warning, $"未知消息,连接被关闭!");
            }
        }
コード例 #4
0
 public override void OnClosed()
 {
     if (_targetConnection.CurrentSession.State == TcpSocketConnectionState.Closed)
     {
         return;
     }
     _targetConnection.CloseSession();
     ListByteBuffer.Clear();
 }
コード例 #5
0
        public override void OnMessage()
        {
            int defineHeadSize     = sizeof(int);
            int defineAccessIdSize = sizeof(long);

            do
            {
                if (!_accessId.HasValue && !_packageLength.HasValue)
                {
                    if (ListByteBuffer.Count < defineHeadSize + defineAccessIdSize)
                    {
                        break;
                    }

                    byte[] headBytes = ListByteBuffer.GetRange(0, defineHeadSize + defineAccessIdSize).ToArray();
                    this._packageLength   = BitConverter.ToInt32(headBytes, 0);
                    this._accessId        = BitConverter.ToInt64(headBytes, defineHeadSize);
                    this._transpondOffset = 0;
                }

                TcpSessionChannelDispatcher dispatcher;
                if (_dispatchers.TryGetValue(_accessId.Value, out dispatcher) || true)
                {
                    var calculateOffsetLength = (_packageLength.Value + defineHeadSize) - _transpondOffset;
                    if (ListByteBuffer.Count <= calculateOffsetLength)
                    {
                        calculateOffsetLength = ListByteBuffer.Count;
                    }

                    var data = ListByteBuffer.GetRange(0, calculateOffsetLength).ToArray();

                    dispatcher?.SendTo(MessageHelper.CopyMessageHeadTo(MessageHead.MID_MESSAGE_DATA,
                                                                       new MessageDataPacket()
                    {
                        AccessId     = dispatcher.DispatcherId,
                        DispatcherId = this.DispatcherId,
                        Data         = data
                    }));

                    this._transpondOffset += data.Length;
                    if (_transpondOffset == _packageLength)
                    {
                        this._accessId = null; this._packageLength = null;
                    }

                    ListByteBuffer.RemoveRange(0, calculateOffsetLength);
                }
            } while (ListByteBuffer.Count > defineHeadSize + defineAccessIdSize);
        }
コード例 #6
0
        public override void OnMessage()
        {
            var defineHeadSize = sizeof(int);

            if (ListByteBuffer.Count < defineHeadSize)
            {
                return;
            }

            byte[] lenBytes   = ListByteBuffer.GetRange(0, defineHeadSize).ToArray();
            int    packageLen = BitConverter.ToInt32(lenBytes, 0);

            if (packageLen < 0 || packageLen > ApplicationConfiguartion.MaxPacketSize || packageLen < 25) //数据不合法 或 小于大概ack固定长度
            {
                this.CloseSession();
                return;
            }

            if (packageLen > ListByteBuffer.Count - defineHeadSize)
            {
                return;
            }

            this._ackRetainPacketData = ListByteBuffer.GetRange(0, defineHeadSize + packageLen).ToArray();
            ListByteBuffer.RemoveRange(0, packageLen + defineHeadSize);

            this._accessId = BitConverter.ToInt64(_ackRetainPacketData, defineHeadSize);

            var longSize    = sizeof(long);
            var packageBody = GZipHelper.Decompress(_ackRetainPacketData, defineHeadSize + longSize, _ackRetainPacketData.Length - defineHeadSize - longSize);
            var messageHead = TakeMessageHead(packageBody);

            if (messageHead == ACK_HEAD)
            {
                var ack = PacketSerializeHelper.DeserializePacket <AckPacket>(TakeMessage(packageBody));
                if (ValidityAccessIdWithKey(ack.Type, ack.AccessId, ack.AccessKey))
                {
                    this.ApportionTypeHandlerEvent?.Invoke(this, ack.Type);
                }
                else
                {
                    this.CloseSession();
                }
            }
            else
            {
                this.CloseSession();
            }
        }
コード例 #7
0
 public override void OnClosed()
 {
     ListByteBuffer.Clear();
 }
 public override void OnClosed()
 {
     _targetConnection.CloseSession();
     ListByteBuffer.Clear();
 }