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); }
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; } }