Ejemplo n.º 1
0
        /// <summary>
        /// 尝试将收到的消息解析为实体对象
        /// </summary>
        /// <param name="buffer">封包消息</param>
        /// <param name="remoteEndPoint">远程主机的端点位置</param>
        /// <returns></returns>
        /// <remarks>如果是分包的消息且当前并未接收完全,则同样返回为空</remarks>
        public Message ResolveToMessage(byte[] buffer, IPEndPoint remoteEndPoint)
        {
            if (buffer == null || buffer.Length < 0)
            {
                return(null);
            }

            Message m = null;

            if (MessagePacker.Test(buffer))
            {
                m = MessagePacker.TryToTranslateMessage(buffer, remoteEndPoint);

                if (m != null)
                {
                    m.Host = LivedHost.GetHost(remoteEndPoint.Address.ToString());

                    //确认是否要发送回复
                    if (DetermineConfirm(m))
                    {
                        Message cm = Message.Create(m.Host, remoteEndPoint, Config.GetRandomTick(), Config.GroupName, Config.NickName,
                                                    FSLib.IPMessager.Define.Consts.Commands.RecvMsg, 0, m.PackageNo.ToString(), "");
                        Send(cm);
                    }
                }
            }
            else if (MessagePackerV2.Test(buffer))
            {
                PackedNetworkMessage pack = MessagePackerV2.Parse(buffer, remoteEndPoint);

                if (pack == null)
                {
                    return(null);
                }

                if (DetermineConfirm(pack))
                {
                    //发送确认标志
                    Message cm = Message.Create(m.Host, remoteEndPoint, Config.GetRandomTick(), Config.GroupName, Config.NickName,
                                                FSLib.IPMessager.Define.Consts.Commands.Ex_PackageRecevied, 0, pack.PackageNo.ToString(), pack.PackageIndex.ToString());
                    Send(cm);
                }
                m = MessagePackerV2.TryToTranslateMessage(pack);

                if (m != null)
                {
                    m.Host = LivedHost.GetHost(remoteEndPoint.Address.ToString());

                    //确认是否要发送回复
                    if (DetermineConfirm(m))
                    {
                        Message cm = Message.Create(m.Host, remoteEndPoint, Config.GetRandomTick(), Config.GroupName, Config.NickName,
                                                    FSLib.IPMessager.Define.Consts.Commands.RecvMsg, 0, m.PackageNo.ToString(), "");
                        Send(cm);
                    }
                    if (DetermineConfirm2(m))
                    {
                        Message cm = Message.Create(m.Host, remoteEndPoint, Config.GetRandomTick(), Config.GroupName, Config.NickName,
                                                    FSLib.IPMessager.Define.Consts.Commands.AnsReadMsg, 0, m.PackageNo.ToString(), "");
                        Send(cm);
                    }
                }
            }

            return(m);
        }