示例#1
0
        /// <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);
                }
            }
        }
示例#2
0
    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);
        }
    }
示例#3
0
        /// <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);
            }
        }