/// <summary> /// 主线程内更新 /// </summary> public void Update() { if (IOSocket == null || IOSocket.Connected == false) { return; } //接收数据 if (_isReceiving == false) { _isReceiving = true; //清空缓存 _receiveBuffer.Clear(); //请求操作 _receiveArgs.SetBuffer(0, _receiveBuffer.Capacity); bool willRaiseEvent = IOSocket.ReceiveAsync(_receiveArgs); if (!willRaiseEvent) { ProcessReceive(_receiveArgs); } } //发送数据 if (_isSending == false && _sendQueue.Count > 0) { _isSending = true; //清空缓存 _sendBuffer.Clear(); //合并数据一起发送 while (_sendQueue.Count > 0) { IPackage packet = _sendQueue.Dequeue(); packet.Encode(_sendBuffer, _tempSBuffer); //如果已经超过一个最大包体尺寸 //注意:发送的数据理论最大值为俩个最大包体大小 if (_sendBuffer.WriterIndex >= NetDefine.PackageMaxSize) { break; } } //请求操作 _sendArgs.SetBuffer(0, _sendBuffer.ReadableBytes()); bool willRaiseEvent = IOSocket.SendAsync(_sendArgs); if (!willRaiseEvent) { ProcessSend(_sendArgs); } } }
public void CreateCfgBytesFile(string path) { MoByteBuffer byteBuffer = new MoByteBuffer(ResDefine.CfgStreamMaxLen); MoByteBuffer tableBuffer = new MoByteBuffer(ResDefine.TabStreamMaxLen); for (int i = 0; i < _tables.Count; i++) { //写入行标记 byteBuffer.WriteShort(ResDefine.TabStreamHead); //清空缓存 tableBuffer.Clear(); //写入数据 IRow row = _tables[i].Row; for (int cellNum = row.FirstCellNum; cellNum < row.LastCellNum; cellNum++) { ICell cell = row.GetCell(cellNum); string value = GetTableCellValue(cell); HeadWrapper head = GetHead(cellNum); WriteCell(tableBuffer, head, value); } //检测数据大小有效性 int tabSize = tableBuffer.ReadableBytes(); if (tabSize == 0) { throw new Exception("Table size is zero."); } //写入到总缓存 byteBuffer.WriteInt(tabSize); byteBuffer.WriteBytes(tableBuffer.ReadBytes(tabSize)); } //创建文件 string filePath = GetSaveFileFullPath(path, ".bytes"); using (FileStream fs = new FileStream(filePath, FileMode.Create)) { byte[] data = byteBuffer.Buf; int length = byteBuffer.ReadableBytes(); fs.Write(data, 0, length); } }
/// <summary> /// 数据接收完成时 /// </summary> private void ProcessReceive(object obj) { SocketAsyncEventArgs e = obj as SocketAsyncEventArgs; // check if the remote host closed the connection if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success) { _receiveBuffer.WriterIndex += e.BytesTransferred; //如果数据写穿 if (_receiveBuffer.WriterIndex > _receiveBuffer.Capacity) { HandleError(true, "The channel fatal error"); return; } //循环解包 while (true) { //如果数据不够一个包头 if (_receiveBuffer.ReadableBytes() < NetDefine.PackageHeadSize) { break; } _receiveBuffer.MarkReaderIndex(); //如果包头标记不正确 Int16 headMark = _receiveBuffer.ReadShort(); if (headMark != NetDefine.PackageHeadMark) { _receiveBuffer.ResetReaderIndex(); _receiveBuffer.ReaderIndex++; continue; } //获取包体信息 Int16 msgType = _receiveBuffer.ReadShort(); Int32 msgSize = _receiveBuffer.ReadInt(); int remainHeadSize = NetDefine.PackageHeadSize - 2 - 2 - 4; for (int i = 0; i < remainHeadSize; i++) { _receiveBuffer.ReadByte(); } //如果协议大小超过最大长度 if (msgSize > NetDefine.PackageMaxSize) { HandleError(false, "The package {0} size is exceeds max size.", msgType); _receiveBuffer.ResetReaderIndex(); _receiveBuffer.ReaderIndex++; continue; } //如果剩余可读数据小于包体长度 if (msgSize > 0 && _receiveBuffer.ReadableBytes() < msgSize) { _receiveBuffer.ResetReaderIndex(); break; //需要退出读够数据再解包 } //正常解包 try { _receiveBuffer.ResetReaderIndex(); IPackage msg = MoNetMsgHandler.Handle(msgType); msg.Decode(_receiveBuffer, _tempRBuffer); lock (_receiveQueue) { _receiveQueue.Enqueue(msg); } } catch (Exception ex) { // 解包异常后继续解包 HandleError(false, "The package {0} decode error : {1}", msgType, ex.ToString()); _receiveBuffer.ResetReaderIndex(); _receiveBuffer.ReaderIndex++; } } //while end //将剩余数据移至起始 _receiveBuffer.DiscardReadBytes(); //为接收下一段数据,投递接收请求 e.SetBuffer(_receiveBuffer.WriterIndex, _receiveBuffer.WriteableBytes()); bool willRaiseEvent = IOSocket.ReceiveAsync(e); if (!willRaiseEvent) { ProcessReceive(e); } } else { HandleError(true, "ProcessReceive error : {0}", e.SocketError); } }