上一章我们讲到了如何用TcpListener侦听连接以及如何使用TcpClient建立一个连接并发送消息(一步一步教你使用.net进行Socket通信)。本文源代码下载(附件) 这一章我们将深入讲解如何定义网络通迅协议及如何使用这个协议进行通迅。
首先我们先重构一下前章提到的网络通迅组件。
我们知道在服务器端和客户端都要侦听是否对方发来消息,如果只在主线程中运行,那我们就没法进行其它如UI等方面的工作了。我们将Listen这个方法提出来放到一个基类中。
新建一个类SocketBase。让Server和Client两个类都继承自这个类。将Server类中的Connections属性放到这个类中(因为Client中也可能有多个连接),由于客户端也要侦听服务器发来的消息,因此我们将_listenningthread和Listenning函数也放到类中。并把private型的变量改为protected以便于继承类可以使用。将Listening函数改为virtual型以便于子类中可以重写。
下面我们定义网络协议如下: 一个消息体包含消息头和消息体两部分。消息体为字符串型。
消息头包含3部分,前4个字节为消息的总长度,第5个字节表示命令,第6、7两个字节表示协议版本号。按此协议,我们定义Message类,源代码如下:
1using System; 2 3namespace SocketLibrary 4{ 5 public class Message 6 { 7 public enum CommandHeader:byte { 8 SendMessage = 1 9 } 10 public Connection SendToOrReceivedFrom; 11 public int MessageLength; 12 public CommandHeader Command; 13 public byte MainVersion; 14 public byte SecondVersion; 15 16 public string MessageBody; 17 18 public Message() 19 { 20 SendToOrReceivedFrom = null; 21 } 22 public Message(CommandHeader command,byte mainVersion,byte secondVersion,string messageBody):this() { 23 this.Command = command; 24 this.MainVersion = mainVersion; 25 this.SecondVersion = secondVersion; 26 this.MessageBody = messageBody; 27 } 28} 我们在Message中增加一个Connection类型的变量是用于存放是要发送的目的或从哪个连接收到的消息。
|