Exemple #1
0
        /// <summary>
        /// 初始化频道
        /// </summary>
        public void InitChannel(MainThreadSyncContext context, Socket socket, Type packageCoderType, int packageBodyMaxSize)
        {
            if (packageCoderType == null)
            {
                throw new System.ArgumentException($"packageCoderType is null.");
            }
            if (packageBodyMaxSize <= 0)
            {
                throw new System.ArgumentException($"packageMaxSize is invalid : {packageBodyMaxSize}");
            }

            _context        = context;
            _socket         = socket;
            _socket.NoDelay = true;

            // 创建编码解码器
            _packageCoder = (NetworkPackageCoder)Activator.CreateInstance(packageCoderType);
            _packageCoder.InitCoder(this, packageBodyMaxSize);
            _packageMaxSize = packageBodyMaxSize + _packageCoder.GetPackageHeaderSize();

            // 创建字节缓冲类
            // 注意:字节缓冲区长度,推荐4倍最大包体长度
            int byteBufferSize = _packageMaxSize * 4;
            int tempBufferSize = _packageMaxSize * 2;

            _sendBuffer    = new ByteBuffer(byteBufferSize);
            _decodeBuffer  = new ByteBuffer(byteBufferSize);
            _receiveBuffer = new byte[tempBufferSize];

            // 创建IOCP接收类
            _receiveArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed);
            _receiveArgs.SetBuffer(_receiveBuffer, 0, _receiveBuffer.Length);

            // 创建IOCP发送类
            _sendArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed);
            _sendArgs.SetBuffer(_sendBuffer.GetBuffer(), 0, _sendBuffer.Capacity);
        }
Exemple #2
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="packageCoderType">通信频道使用的网络包编码解码器类型</param>
 /// <param name="packageBodyMaxSize">网络包体最大长度</param>
 public TcpClient(Type packageCoderType, int packageBodyMaxSize)
 {
     _packageCoderType   = packageCoderType;
     _packageBodyMaxSize = packageBodyMaxSize;
     _syncContext        = new MainThreadSyncContext();
 }