需求:TCP通讯中客户端与服务端交互会有若干中指令,例如完成一个客户度登录过程,必须先建立握手连接,然后登录,假设服务端规定这个过程中,握手连接必须先建立起来,然后才能登录,不得越级。如何让程序顺序执行?
假设通讯指令涉及如下三个指令:
Send_ConnectToServer、Send_ClientSayHello、Send_Login
使用委托的方法,首先建立委托,参数就用实体类传入,这样比较简单,假设实体类
MessageEntity
申明委托:
public delegate string ProcessDelegate(Costaco.Mid.HPInterface.MessageEntity pEntity);
申明任务列表:
public ProcessDelegate [] mProcess;
public int mProcessIndex = 0;\\任务执行的索引
对Send_ConnectToServer、Send_ClientSayHello、Send_Login分别建立三个方法,例:
- private string Send_ConnectToServer(MessageEntity pEntity)
- {
- if (mTcpCli.IsConnected == false) //mTcpCli是我建立的异步通讯Class
- {
- mTcpCli.Connect(this.txtIP.Text.Trim(), Convert.ToInt32(this.txtPort.Text));
- mTcpCli.Send(new byte[] { });
- }
- mProcessIndex = mProcessIndex + 1;
- return "";
- }
例如要建立一个调用任务列表,可以按如下代码:
- mProcess = new ProcessDelegate[3];
- mProcess[0] = new ProcessDelegate(Send_ConnectToServer);
- mProcess[1] = new ProcessDelegate(Send_ClientSayHello);
- mProcess[2] = new ProcessDelegate(Send_hs_validate);
- mProcessIndex = 0;
- #region 调用任务列表中的第一个任务
- if (mProcessIndex < mProcess.Length)
- {
- mProcess[mProcessIndex].Invoke(mEntity);
- }
- #endregion 调用任务列表中的第一个任务
在通讯的解析程序中,监测到数据已经完整接收,并且已经解析,则可以调用下一个任务,执行如下代码即可
- #region 调用任务列表中的其它任务
- if (mProcessIndex < mProcess.Length)
- {
- mProcess[mProcessIndex].Invoke(mEntity);
- }
- #endregion 调用任务列表中的其它任务
由于没有写测试代码,是项目中使用,因此没有拿出整个程序,这部分代码已经是完整的了。关键在于建立和调用,也就是
mProcess = new ProcessDelegate[3];
mProcess[0] = new ProcessDelegate(Send_ConnectToServer);
mProcess[1] = new ProcessDelegate(Send_ClientSayHello);
mProcess[2] = new ProcessDelegate(Send_hs_validate);
和
mProcess[mProcessIndex].Invoke(mEntity);