コード例 #1
0
ファイル: DistHead.cs プロジェクト: chenmj201601/UMP
        internal static DistHead FromHead(_TAG_NETPACK_DISTINGUISHHEAD_VER1 ver1Head)
        {
            DistHead info = new DistHead();

            info.PackType   = ver1Head._packtype;
            info.FollowSize = ver1Head._followsize;
            info.SourceID   = ver1Head._source;
            info.TargetID   = ver1Head._target;
            info.Time       = Helpers.GetTimeFromTimestamp((long)ver1Head._timestamp);
            info.BaseType   = ver1Head._basehead;
            info.BaseSize   = ver1Head._basesize;
            info.ExtType    = ver1Head._exthead;
            info.ExtSize    = ver1Head._extsize;
            info.DataSize   = ver1Head._datasize;
            info.ModuleID   = ver1Head._moduleid;
            info.Number     = ver1Head._number;
            info.Message    = MessageString.FromMessage(ver1Head._message);
            return(info);
        }
コード例 #2
0
        private void ReceiveMessageWorker(IAsyncResult result)
        {
            //先接收识别头
            var stream = result.AsyncState as Stream;

            if (stream == null)
            {
                return;
            }
            int intSize;

            try
            {
                intSize = stream.EndRead(result);
                if (intSize <= 0)
                {
                    OnDebug(string.Format("Recieve 0 length message."));
                    mIsConnected = false;
                    return;
                }
            }
            catch (Exception ex)
            {
                var dispose = ex as ObjectDisposedException;
                if (dispose == null)
                {
                    OnDebug(string.Format("EndRecieve fail.\t{0}", ex.Message));
                }
                mIsConnected = false;
                return;
            }
            try
            {
                //OnDebug(string.Format("Receive:{0}Byte", intSize));
                Array.Copy(mReceiveBuffer, 0, mBufferedData, mBufferedSize, intSize);
                mBufferedSize += intSize;
                if (mBufferedSize >= mDistHeadSize)
                {
                    //实际上只有可能等于,因为每次接收都是指定大小的

                    //取出数据
                    byte[] temp = new byte[mDistHeadSize];
                    Array.Copy(mBufferedData, 0, temp, 0, mDistHeadSize);
                    //重置缓存区
                    mBufferedSize = 0;
                    mBufferedData.Initialize();

                    //得到识别头,根据FollowSize大小接收基本头,扩展头和数据区
                    var distHead   = (_TAG_NETPACK_DISTINGUISHHEAD_VER1)Converter.Bytes2Struct(temp, typeof(_TAG_NETPACK_DISTINGUISHHEAD_VER1));
                    int followSize = distHead._followsize;
                    //OnDebug(string.Format("DistHead\tFollowSize:{0}", followSize));

                    //循环,直到接收完FollowSize大小
                    int receiveSize = 0;
                    while (receiveSize < followSize)
                    {
                        intSize      = stream.Read(mReceiveBuffer, receiveSize, followSize - receiveSize);
                        receiveSize += intSize;
                        Thread.Sleep(1);
                    }
                    if (receiveSize != followSize)
                    {
                        OnDebug(string.Format("FollowSize invalid"));
                        mIsConnected = false;
                        return;
                    }
                    MessageReceivedEventArgs args = new MessageReceivedEventArgs();
                    args.DistHead = DistHead.FromHead(distHead);
                    int baseHeadSize = distHead._basesize;
                    if (baseHeadSize > 0)
                    {
                        //OnDebug(string.Format("BaseHead:{0}\tSize:{1}", distHead._basehead, baseHeadSize));
                        temp = new byte[baseHeadSize];
                        Array.Copy(mReceiveBuffer, 0, temp, 0, temp.Length);
                        args.BaseHead = temp;
                        switch (distHead._basehead)
                        {
                        case DecDefines.NETPACK_BASETYPE_CONNECT_WELCOME:
                            var welcomeHead = (_TAG_NETPACK_BASEHEAD_CONNECT_WELCOME)Converter.Bytes2Struct(temp,
                                                                                                            typeof(_TAG_NETPACK_BASEHEAD_CONNECT_WELCOME));
                            OnDebug(string.Format("Message:{0}\t{1}\t({2})", "Welcome",
                                                  Helpers.ConvertByteArrayToString(welcomeHead._server_appname),
                                                  welcomeHead._client_endpointid));

                            mEndpointID = welcomeHead._client_endpointid;
                            if (mEndpointID <= 0)
                            {
                                OnDebug(string.Format("EndpointID invalid"));
                            }

                            //收到欢迎消息,发送登录消息(延时不能超过3s,否则服务端会断开本次连接)
                            SendLogonPackage(welcomeHead);

                            break;

                        case DecDefines.NETPACK_BASETYPE_CONNECT_AUTHEN:
                            var authHead =
                                (_TAG_NETPACK_BASEHEAD_CONNECT_AUTHEN)
                                Converter.Bytes2Struct(temp, typeof(_TAG_NETPACK_BASEHEAD_CONNECT_AUTHEN));
                            OnDebug(string.Format("Message:{0}\t{1}", "Auth", authHead._errorcode));
                            if (authHead._errorcode != 0)
                            {
                                OnDebug(string.Format("登录验证失败\t{0}", authHead._errorcode));
                            }
                            else
                            {
                                //登录成功,触发ServerConnected事件
                                OnServerConnectedEvent(true, string.Format("Server connected.\t{0}", mEndpointID));

                                //登录成功,启动发送心跳包的线程
                                CreateHeartbeatThread();

                                //订阅消息,登录成功后就可以订阅消息了
                                if (mIsSubscribeAfterAuthed)
                                {
                                    SendAddSubscribePackage();
                                }
                            }
                            break;

                        case DecDefines.NETPACK_BASETYPE_CONNECT_ERROR:
                            //握手过程中出现错误
                            var errorHead =
                                (_TAG_NETPACK_BASEHEAD_ERROR)
                                Converter.Bytes2Struct(temp, typeof(_TAG_NETPACK_BASEHEAD_ERROR));
                            OnDebug(string.Format("Message:{0}\t{1}", "Error", errorHead._error_code));
                            break;

                        case DecDefines.NETPACK_BASETYPE_RES_ADDSUBSCRIBE:
                            var addSubscribeHead =
                                (_TAG_NETPACK_BASEHEAD_RES_ADD_SUBSCRIBE)
                                Converter.Bytes2Struct(temp, typeof(_TAG_NETPACK_BASEHEAD_RES_ADD_SUBSCRIBE));
                            OnDebug(string.Format("Message:{0}\t{1}", "RESAddSubscribe", addSubscribeHead._errorcode));
                            if (addSubscribeHead._errorcode != 0)
                            {
                                OnDebug(string.Format("订阅消息失败\t{0}", addSubscribeHead._errorcode));
                            }
                            break;

                        case DecDefines.NETPACK_BASETYPE_APPLICATION_VER1:
                            var appVer1 =
                                (NETPACK_BASEHEAD_APPLICATION_VER1)
                                Converter.Bytes2Struct(temp, typeof(NETPACK_BASEHEAD_APPLICATION_VER1));
                            //收到应用层消息
                            OnDebug(string.Format("Message:{0}\t{1}", "App_Ver1", appVer1._datasize));
                            var appHead = AppHead.FromAppVer1(appVer1);
                            args.AppHead = appHead;
                            break;
                        }
                    }
                    int extHeadSize = distHead._extsize;
                    if (extHeadSize > 0)
                    {
                        //OnDebug(string.Format("ExtHead:{0}\tSize:{1}", distHead._exthead, extHeadSize));
                        temp = new byte[extHeadSize];
                        Array.Copy(mReceiveBuffer, baseHeadSize, temp, 0, temp.Length);
                        args.ExtHead = temp;
                    }
                    int dataSize = distHead._datasize;
                    if (dataSize > 0)
                    {
                        //OnDebug(string.Format("DataSize:{0}", dataSize));
                        temp = new byte[dataSize];
                        Array.Copy(mReceiveBuffer, baseHeadSize + extHeadSize, temp, 0, temp.Length);
                        args.Data = temp;
                    }

                    OnMessageReceivedEvent(args);
                }
            }
            catch (Exception ex)
            {
                OnDebug(string.Format("DealMessage fail.\t{0}", ex.Message));
            }
            try
            {
                stream.BeginRead(mReceiveBuffer, 0, mDistHeadSize - mBufferedSize, ReceiveMessageWorker, stream);
            }
            catch (Exception ex)
            {
                var dispose = ex as ObjectDisposedException;
                if (dispose == null)
                {
                    OnDebug(string.Format("BeginReceive fail.\t{0}", ex.Message));
                }
                mIsConnected = false;
            }
        }