由于我们在向网络流写入的时候需要写入的是byte数组。我们给Message类增加一个ToBytes方法。返回一个字节数组。
1public byte[] ToBytes() { 2 this.MessageLength = 7 + SocketFactory.DefaultEncoding.GetByteCount(this.MessageBody);//计算消息总长度。消息头长度为7加上消息体的长度。 3 byte[] buffer = new byte[this.MessageLength]; 4 //先将长度的4个字节写入到数组中。 5 BitConverter.GetBytes(this.MessageLength).CopyTo(buffer,0); 6 //将CommandHeader写入到数组中 7 buffer[4] = (byte)this.Command; 8 //将主版本号写入到数组中 9 buffer[5] = (byte)this.MainVersion; 10 //将次版本号写入到数组中 11 buffer[6] = (byte)this.SecondVersion; 12 13 //消息头已写完,现在写消息体。 14 SocketFactory.DefaultEncoding.GetBytes(this.MessageBody,0,this.MessageLength - 7, buffer,7); 15 return buffer; 16} 我们从网络流中读取的字节数组也要转换为Message类。我们用一个静态方法Parse来实现。该方法的参数为Connection。返回一个Message类。
1public static Message Parse(Connection connection) { 2 Message message = new Message(); 3 //先读出前四个字节,即Message长度 4 byte[] buffer = new byte[4]; 5 if(connection.NetworkStream.DataAvailable) { 6 int count = connection.NetworkStream.Read(buffer,0,4); 7 if(count == 4) { 8 message.MessageLength = BitConverter.ToInt32(buffer,0); 9 } 10 else 11 throw new Exception("网络流长度不正确"); 12 } 13 else 14 throw new Exception("目前网络不可读"); 15 //读出消息的其它字节 16 buffer = new byte[message.MessageLength - 4]; 17 if(connection.NetworkStream.DataAvailable) { 18 int count = connection.NetworkStream.Read(buffer,0,buffer.Length); 19 if(count == message.MessageLength -4) { 20 message.Command = (CommandHeader)buffer[0]; 21 message.MainVersion = buffer[1]; 22 message.SecondVersion = buffer[2]; 23 24 //读出消息体 25 message.MessageBody = SocketFactory.DefaultEncoding.GetString(buffer,3,buffer.Length - 3); 26 message.SendToOrReceivedFrom = connection; 27 28 return message; 29 } 30 else 31 throw new Exception("网络流长度不正确"); 32 } 33 else 34 throw new Exception("目前网络不可读"); 35 } 36 37}
|