コード例 #1
0
        private void Client_OnPackReceived(object sender, PackEventArgs e)
        {
            var             type = e.Pack.GetType();
            Action <object> handler;

            if (this.handlers.TryGetValue(type, out handler))
            {
                handler?.Invoke(e.Pack);
            }
        }
コード例 #2
0
        private async Task BeginRead(Stream ns)
        {
            Log.Debug("Begin read loop.");
            var readBuffer             = new RingBufferStream();
            ICryptoTransform transform = null;

            var br      = new BinaryReader(readBuffer);
            var buffer  = new byte[4096];
            int packLen = -1;

            try
            {
                while (true)
                {
                    int count = await ns.ReadAsync(buffer, 0, buffer.Length);

                    Log.Debug("Read {0} bytes.", count);
                    if (count <= 0)
                    {
                        break;
                    }
                    readBuffer.Append(buffer, 0, count);

                    while (true)
                    {
                        //切换加密
                        if (transform != this.readCrypto)
                        {
                            transform = this.readCrypto;
                            if (transform == null)
                            {
                                br = new BinaryReader(readBuffer);
                            }
                            else
                            {
                                var cs = new CryptoStream(readBuffer, transform, CryptoStreamMode.Read);
                                br = new BinaryReader(cs);
                            }
                        }
                        if (packLen < 0)
                        {
                            if (readBuffer.Length >= 2)
                            {
                                packLen = br.ReadUInt16();
                                readBuffer.ClearPrevious();
                            }
                        }
                        if (packLen == 0)
                        {
                            continue;
                        }
                        else if (packLen > 0)
                        {
                            if (readBuffer.Length >= packLen)
                            {
                                var pack = DecodePack(br.ReadBytes(packLen));
                                Log.Debug("Read pack: {0}.", pack);

                                if (pack != null)
                                {
                                    var e = new PackEventArgs(pack);
                                    this.OnPackReceived?.Invoke(this, e);
                                }
                                readBuffer.ClearPrevious();
                                packLen = -1;
                            }
                            else
                            {
                                break;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error("Read Error: {0}", ex.Message);
            }
            finally
            {
                Log.Debug("End read.");
                try
                {
                    this.writeQueue.CompleteAdding();
                }
                catch
                {
                }
                ns.Close();
            }
        }