StreamContractHelper : IStreamContractHelper 2 { 消息头长度 MessageHeaderLength 7 { 8 get { return MsgHead.HeadLength; } 9 } 从消息头中解析出消息体长度,从而可以间接取出消息体 ParseMessageBodyLength(byte[] head) 16 { 17 return BitConverter.ToInt32(head,4); 18 } 19 } 20
View Code然后我们来定义满足协议的消息基类,其中重点是要定义ToContractStream()方法,使得消息能够序列化成满足协议的二进制流,从而通过网络进行传输。
1 [Serializable] BaseMsg 3 { msgType; MsgType 7 { 8 get { return msgType; } 9 set { msgType = value; } 10 } 序列化为本次通信协议所规范的二进制消息流 [] ToContractStream() 16 { 17 return MsgHelper.BuildMsg(this.msgType, SerializeHelper.SerializeObject(this)); 18 } 19 }
View Code然后我们来看看MsgHelper类的具体实现
MsgHelper 2 { 构建消息 [] BuildMsg(int msgType, Byte[] msgBody) 10 { 11 MsgHead msgHead = new MsgHead(msgType, msgBody.Length); [] msg = BufferJointer.Joint(msgHead.ToStream(), msgBody); 14 return msg; 15 } [] BuildMsg(int msgType, string str) 18 { 19 return MsgHelper.BuildMsg(msgType, Encoding.UTF8.GetBytes(str)); 20 } 将二进制数组还原成消息对象 T DeserializeMsg<T>(byte[] msg) 28 { 29 return (T)SerializeHelper.DeserializeBytes(msg, 8, msg.Length - 8); 30 } 31 }
View Code然后我们再看一个具体的消息类ChatMsg的定义
1 [Serializable] ChatMsg:BaseMsg 3 { sourceUserID; 发送该消息的用户ID SourceUserID 9 { 10 get { return sourceUserID; } 11 set { sourceUserID = value; } 12 } targetUserID; 该消息所发往的用户ID TargetUserID 18 { 19 get { return targetUserID; } 20 set { targetUserID = value; } 21 } 22 private DateTime timeSent; 该消息的发送时间 DateTime TimeSent 27 { 28 get { return timeSent; } 29 set { timeSent = value; } 30 } msgText; MsgText 36 { 37 get { return msgText; } 38 set { msgText = value; } 39 } 构造一个ChatMsg实例 ChatMsg(string _sourceUserID, string _targetUserID, string _MsgText) 47 { 48 base.MsgType = Core.MsgType.Chatting; 49 this.sourceUserID = _sourceUserID; 50 this.targetUserID = _targetUserID; 51 this.timeSent = DateTime.Now; 52 this.msgText = _MsgText; 53 } 54 }
View Code 四·登录的通信过程