需求: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分别建立三个方法,例:

  1. private string Send_ConnectToServer(MessageEntity pEntity)
  2. {
  3. if (mTcpCli.IsConnected == false)  //mTcpCli是我建立的异步通讯Class
  4. {
  5. mTcpCli.Connect(this.txtIP.Text.Trim(), Convert.ToInt32(this.txtPort.Text));
  6. mTcpCli.Send(new byte[] { });
  7. }
  8. mProcessIndex = mProcessIndex + 1;
  9. return "";
  10. }

例如要建立一个调用任务列表,可以按如下代码:

  1. mProcess = new ProcessDelegate[3];
  2. mProcess[0] = new ProcessDelegate(Send_ConnectToServer);
  3. mProcess[1] = new ProcessDelegate(Send_ClientSayHello);
  4. mProcess[2] = new ProcessDelegate(Send_hs_validate);
  5. mProcessIndex = 0;
  6. #region 调用任务列表中的第一个任务
  7. if (mProcessIndex < mProcess.Length)
  8. {
  9. mProcess[mProcessIndex].Invoke(mEntity);
  10. }
  11. #endregion 调用任务列表中的第一个任务

在通讯的解析程序中,监测到数据已经完整接收,并且已经解析,则可以调用下一个任务,执行如下代码即可

  1. #region 调用任务列表中的其它任务
  2. if (mProcessIndex < mProcess.Length)
  3. {
  4. mProcess[mProcessIndex].Invoke(mEntity);
  5. }
  6. #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);

转载于:https://blog.51cto.com/cnming/614596

用委托的方法调用TCP通讯指令列表相关推荐

  1. 【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )

    文章目录 一.批量方法委托 二.完整代码示例 一.批量方法委托 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法委托 | 正常方法调用 | 方法委托实现 | 代码示例 ) 中 , 将 ...

  2. 西门子PLC S7-1500系列CPU与西门子PLC S7-300系列的通讯模块CP343-1进行TCP通讯的方法

    西门子PLC S7-1500系列是西门子新一代PLC产品,它通过多方面的创新,为用户提供了更高性价比的产品,提高了用户的工程实施效率.西门子PLC S7-1500为用户在自动化控制系统中提供了更高的运 ...

  3. boost asio 异步实现tcp通讯

    一.前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的.而tcp通讯是项目当中经常 ...

  4. 系统间通信2:通信管理与远程方法调用RMI

    本文引用 : https://yinwj.blog.csdn.net/article/details/49120813 RMI : Remote Method Invocation,远程方法调用 RP ...

  5. activeMQ的源码分析 -TCP通讯机制

    2019独角兽企业重金招聘Python工程师标准>>> activeMQ的源码分析 -TCP通讯机制 博客分类: MQ <IGNORE_JS_OP style="WO ...

  6. 《 Python程序设计项目案例》— 用Python开发的基于TCP通讯协议的私人聊天室 (期末大作业、结课作业、课程设计、毕业设计)

    基于Python与TCP协议的私人聊天室(GUI交互界面,用户注册.用户登录.实时聊天,文件上传与下载) 用Python开发的基于TCP通讯协议的实时聊天通讯和文件共享应用 目录 基于Python与T ...

  7. Python中UDP/TCP通讯简单案例

    python使用udp协议要通过socket技术: 1.引包 2.创建流对象(ipv4, udp) 3.发送(二进制字符串, 元组ip和端口) 4.关闭流对象 socket: 译为:套接字/流对象 网 ...

  8. 高效能TCP通讯基础组件Beetle.Express

    Beetle.Express是Beetle相应的免费版Tcp通讯组件,Beetle.Express提供基础的TCP通讯封装,虽然只具备了基础功能,但在TCP吞吐上有着和Beetle一样出色的性能.组件 ...

  9. C#编码实践:使用委托和特性调用指定函数

    2019独角兽企业重金招聘Python工程师标准>>> 建立一个C#控制台应用程序AttributeTest. 建立一个类Operations,代码如下: namespace Att ...

最新文章

  1. php 6.0新特性,新版特性 | 序言 | Laravel 6 中文文档
  2. go gin 第二次使用ShouldBindJSON失效的原因及解决办法:使用ShouldBindBodyWith代替
  3. 【最长公共前缀】算法优化笔记
  4. 为什么使用%lf读取double型的值,而用%f进行显示?
  5. linux Kernel Map
  6. biee mysql,Linux环境中使用BIEE 连接SQLServer业务数据源的简单示例
  7. 计算机英语 mp3,计算机英语会话(MP3+中英字幕) 第21期:操作系统(5)
  8. 解决KEIL MDK编译生成Bin文件时,却生成了*bin文件夹
  9. Kingdom Rush 国王保卫战图文攻略
  10. 计算机改显存会有啥影响,显卡内存越大越好吗?显存对计算机速度(全文)的影响...
  11. wps在线编辑梳理(此处整理了对接过后容易出错的地方)
  12. 导出RK3288开发板上的根文件系统,并打包img
  13. 标识(志)符的概念与规则
  14. 2022-2027年中国农村小额贷款行业市场调研及未来发展趋势预测报告
  15. 《动态规划》— 动态规划分类
  16. MySQL数据库常见错误与解决方法总结
  17. 对那些家庭经济特别艰难的学生
  18. ENVI去除影像的地理坐标信息
  19. 中国志愿者服务器注册,全国志愿服务信息系统操作指南二(志愿者注册)
  20. 采用策略分布曲线评估信用风险模型的效果

热门文章

  1. 大厂面试算法系列-如何从无序链表中移除重复项(一)-顺序删除
  2. Hadoop入门基础教程 Hadoop之服务器基础环境搭建
  3. mysql单实例多数据库_Mysql单实例数据库的安装
  4. 两片74161实现60进制_74ls161集成60进制加法计数 - 74LS161集成计数器电路(2、3、4、6、8、10、60进制计数器)...
  5. ConcurrentProgramming:interrupt
  6. Security中常见的权限控制方式
  7. datax实现mysql数据同步
  8. 如何优雅地编写Java
  9. saltstack案例 自助机
  10. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-实现字典的打印...