/// <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); } } }
/// <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()); }