Example #1
0
        /// <summary>
        /// 主线程内更新
        /// </summary>
        public void Update()
        {
            if (IOSocket == null || IOSocket.Connected == false)
            {
                return;
            }

            // 接收数据
            if (_isReceiving == false)
            {
                _isReceiving = true;

                // 清空缓存
                _packageCoder.ClearReceiveBuffer();

                // 请求操作
                _receiveArgs.SetBuffer(0, _packageCoder.GetReceiveBufferCapacity());
                bool willRaiseEvent = IOSocket.ReceiveAsync(_receiveArgs);
                if (!willRaiseEvent)
                {
                    ProcessReceive(_receiveArgs);
                }
            }

            // 发送数据
            if (_isSending == false && _sendQueue.Count > 0)
            {
                _isSending = true;

                // 清空缓存
                _packageCoder.ClearSendBuffer();

                // 合并数据一起发送
                while (_sendQueue.Count > 0)
                {
                    // 数据压码
                    System.Object packet = _sendQueue.Dequeue();
                    _packageCoder.Encode(packet);

                    // 如果已经超过一个最大包体尺寸
                    // 注意:发送的数据理论最大值为俩个最大包体大小
                    if (_packageCoder.GetSendBufferWriterIndex() >= _packageMaxSize)
                    {
                        break;
                    }
                }

                // 请求操作
                _sendArgs.SetBuffer(0, _packageCoder.GetSendBufferReadableBytes());
                bool willRaiseEvent = IOSocket.SendAsync(_sendArgs);
                if (!willRaiseEvent)
                {
                    ProcessSend(_sendArgs);
                }
            }
        }
Example #2
0
        /// <summary>
        /// 初始化频道
        /// </summary>
        public void InitChannel(Socket socket, Type packageCoderType, int packageMaxSize)
        {
            if (packageCoderType == null)
            {
                throw new System.ArgumentException($"packageCoderType is null.");
            }
            if (packageMaxSize <= 0)
            {
                throw new System.ArgumentException($"packageMaxSize is invalid : {packageMaxSize}");
            }

            IOSocket         = socket;
            IOSocket.NoDelay = true;
            _packageMaxSize  = packageMaxSize;

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

            _receiveArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed);
            _receiveArgs.SetBuffer(_packageCoder.GetReceiveBuffer(), 0, _packageCoder.GetReceiveBufferCapacity());

            _sendArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed);
            _sendArgs.SetBuffer(_packageCoder.GetSendBuffer(), 0, _packageCoder.GetSendBufferCapacity());
        }