正在阅读:逐步教你使用.net进行Socket通信进阶篇逐步教你使用.net进行Socket通信进阶篇

2005-09-16 10:08 出处: 作者:rainlake 责任编辑:moningfeng

  由于我们在向网络流写入的时候需要写入的是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}

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品