예제 #1
0
        public virtual List <MessageBean> Decoder(IOSession session, byte[] buff)
        {
            if (this._LBuff.Count > 0)
            {
                //拷贝之前遗留的字节
                this._LBuff.AddRange(buff);
                buff        = this._LBuff.ToArray();
                this._LBuff = new List <byte>(2);
            }
            List <MessageBean> list = new List <MessageBean>();

            BufferReader buffers = new BufferReader(buff);

            try
            {
                byte[] _buff;

Label_0073:

                /*判断本次解析的字节是否满足常量字节数 */
                if (buffers.BaseStream.Length - buffers.BaseStream.Position > ConstLenght)
                {
                    /*去掉包头判断,直接验证报文,物联网不能这样写,改为这样是为了和java游戏代码一致*/
                    int msgLenght = ReadInt(buffers.ReadBytes(4));
                    if (msgLenght <= (buffers.BaseStream.Length - buffers.BaseStream.Position))
                    {
                        int msgId = ReadInt(buffers.ReadBytes(4));
                        /*扣除消息Id 4个字节*/
                        _buff = buffers.ReadBytes(msgLenght - 4);
                        list.Add(new MessageBean()
                        {
                            MsgId = msgId, MsgBuff = _buff, Session = session
                        });
                        goto Label_0073;
                    }
                    else
                    {
                        //剩余字节数刚好小于本次读取的字节数 存起来,等待接受剩余字节数一起解析
                        buffers.BaseStream.Seek(-4, SeekOrigin.Current);
                    }
                }

                /*如果有字符,那么全部缓存*/
                if ((buffers.BaseStream.Length - buffers.BaseStream.Position) > 0)
                {
                    _buff = buffers.ReadBytes((int)(buffers.BaseStream.Length - buffers.BaseStream.Position));
                    this._LBuff.AddRange(_buff);
                }
            }
            catch { }
            finally
            {
                buffers.Close();
                buffers.Dispose();
            }
            return(list);
        }
예제 #2
0
            public void ChannelRead(IOSession session, int msgId, byte[] buffer)
            {
                BufferReader br = new BufferReader(buffer);

                if (msgId == 255)
                {
                    /*消息唯一回复id*/
                    long mmid = br.ReadInt64();

                    log.Error("收到客户端消息回复:" + session.ID + "  消息唯一回复id" + mmid);

                    Program.sendtask.remove();
                }
            }
예제 #3
0
            public void ChannelRead(IOSession session, int msgId, byte[] buffer)
            {
                /*收到服务器发送来的消息*/
                BufferReader br = new BufferReader(buffer);

                if (msgId == 2)
                {
                    /*消息唯一回复id*/
                    long mmid = br.ReadInt64();
                    /*收到消息回复消息处理*/
                    log.Error("收到服务器消息:" + session.ID + "  消息唯一回复id" + mmid);

                    BufferWriter bw = new BufferWriter();
                    bw.Write(mmid);
                    session.WriteAndFlush(255, bw.GetBuffer());
                }
            }
예제 #4
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="session"></param>
 /// <param name="msgId">和java同步,消息ID</param>
 /// <param name="msgBuffer">消息完整报文</param>
 /// <param name="outBuf"></param>
 public virtual void Encoder(IOSession session, int msgId, byte[] msgBuffer, BufferWriter outBuf)
 {
     ///*包头*/
     //outBuf.Write(ConstStart1);
     ///*包头*/
     //outBuf.Write(ConstStart2);
     /*改为和java同步的游戏版本处理方案*/
     if (msgBuffer != null || msgBuffer.Length > 0)
     {
         /*长度*/
         outBuf.Write(WriterInt(msgBuffer.Length + 4));
         outBuf.Write(WriterInt(msgId));
         outBuf.Write(msgBuffer);
     }
     else
     {
         /*长度*/
         outBuf.Write(WriterInt(4));
         outBuf.Write(WriterInt(msgId));
     }
     /*道理应该压入包尾的,一般无需*/
 }
예제 #5
0
 public void ChannelInactive(IOSession session)
 {
 }
예제 #6
0
 public void ChannelUnregistered(IOSession session, params string[] obj)
 {
 }
예제 #7
0
 public void ExceptionCaught(IOSession session, Exception ex)
 {
 }
예제 #8
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="session"></param>
 /// <param name="msgBuffer">消息完整报文</param>
 /// <param name="outBuf"></param>
 public virtual void Encoder(IOSession session, MessageBean bean, BufferWriter outBuf)
 {
     Encoder(session, bean.MsgId, bean.MsgBuff, outBuf);
 }