对于事件和委托机制不够理解的读者可以参考本节提供的委托相关的范例程序,这个是控制台的程序,比较简洁(书店发布一本书的事件注册到某个读者A身上,原理跟前面一小节讲的是一致的,只不过没有通过委托对外发送数据,所以实用性不是很广,后面还有两个范例也是对事件和委托的进一步深入)

 

事实上我任意一个控件双击事件进去也是这么个套路,比如整个程序的加载和关闭事件,我们只是在Form的事件上选几个鼠标双击进去,貌似直接定位到了方法(private void SocketTest_Load,而且直接为我们写好了过来的参数),实际上只要找到Designer.cs文件还是能找到委托和事件的代码(this就表示这个窗体,可以简单理解为窗体的加载/关闭事件发生的时候,去执行SocketTest_Load/SocketTest_FormClosing方法)

 

再来看我们自定义封装的类使用了事件和委托之后,也变得非常简洁,可读写很强(如果类是静态的,委托也要做成静态的)

 

在理解了事件和委托机制,且实现了客户端代码后,我们把服务器端的代码也实现,服务器比客户端稍微复杂一点,启动的时候他先会阻阻塞在Accept方法上(直到有客户端连接上来才会接着往下执行,所以BeginListen方法也要放到线程中执行,如果有客户端连接上来,则接着新建一个线程不断获取读取客户端发来的数据)

 

此外跟客户端不同的地方在于,服务器需要额外定义一个socket对象(client_socket,如果前面的Accept方法被成功执行,则client_socket就会得到客户端的IP地址等信息,后面的给这个客户端的收发也是通过这个Accept之后实例化的client_socket在进行,可想而知,如果是要做1个服务器对多个客户端的,每次客户端连接上就需要分配不同的client_socket对象过去,否则一个client_socket只会保存一个客户端的消息,这样子一对多,服务器发的消息只会跑到最新的连接上来的客户端那里)

 

当服务器主动点击断开的时候,还是需要发送一条空消息(仿照JAVA版的SocketTest),空消息并不是空字符串,你发空字符串可能还是有意义,回车换行之类的,可以直接发一个空的byte数组过去,这样我们前面写的客户端收到第一个byte是0的时候就知道要服务器点击断开了

 

最后是对界面整个的重新布局,前面我们用的都是文本框,最好还是用listbox,每次收到数据之后自动刷新显示最后一条(也是仿照他的做法,他每次发完之后就把文本框清空了,这个我认为没有必要)

 

服务器端要比客户端稍微功能多一点,刷新本机IP,设置本机IP都应该是服务器这边的功能(而PING一个网络地址应该既不属于client也不属于server,所以放在顶部比较合适)

 

最后添加一个LOGO,就可以像JAVA版的SocketTest发布了(添加一个自定义的ICO,可以在程序运行的时候左上角和图标都有显示)

 

总结:除了同步的方式实现Socket通信,还有异步的方式,而且除了TCP方式还有UDP方式(广播的方式,比如一个服务器对应多个客户端,服务器发一条消息不需要指定给哪个客户,就是所有客户都收到),此外基于Socket通信还产生了很多工业的通讯协议比如ModbusTCP,EtherNetIP(Socekt的TCP/IP通信就只是简单规定了收发字节流byte数组,后面在此基础上又对字节流做了很多规定,比如开头,结尾,数据段定义,错误校验等等,从而形成了更简洁,更不容易出错的字节流,比较规范的叫做数据帧),在这里都不做详细的分析,感兴趣的读者可以自己去想办法实现,最简单的同步socekt已经够用了。

1 实现完整的Socket通信的流程,理解客户端,服务器的通信流程

2 理解定义Socket的服务器和客户端的方法,不做成静态的好处(读者可以自己测试开放多个端口和连接多个客户端的要如何实现,如果做成静态的就没法实现了)

3 理解委托和事件在传递消息方面的优越性,在以后的代码中除了会把各种方法封装成类(尤其是基础教程讲了很多字符串方法,数学运算方法),还要会规范类的数据处理,最好的方式就是通过委托

 

 

更多教学视频和资料下载,欢迎关注以下信息:

我的优酷空间:

http://i.youku.com/acetaohai123

 

我的在线论坛:

http://csrobot.gz01.bdysite.com/

 

问题交流:

QQ:910358960

邮箱:acetaohai123@163.com

 

 

 

C#应用视频教程1.4 实现完整以太网通讯的更多相关文章

  1. STM32F412应用开发笔记之五:结合W5500实现以太网通讯

    因实际使用需求我们测试一下网络通讯,在NUCLEO-F412ZG测试板上没有以太网部分,我们选择外接一个W5500的实验板.W5500支持SPI接口通讯,DC3.3V供源.而NUCLEO-F412ZG ...

  2. 西门子S7系列以太网通讯处理器功能介绍

    北京华科远创科技有限研发的远创智控型号ETH-YC模块适用于西门子S7-200/S7-300/S7-400.SMART S7-200.西门子数控840D.840DSL.合信.亿维PLC的PPI/MPI ...

  3. 西门子S7200/300/400以太网通讯处理器选型分类

    北京华科远创科技有限研发的远创智控转以太网模块适用于西门子S7-200/S7-300/S7-400.SMART S7-200.西门子数控840D.840DSL.合信.亿维PLC的PPI/MPI/PRO ...

  4. 博途V13 仿真S7-300PLC 与HMI 的以太网通讯。实现简单功能 HMI 型号是TP900

    本项目仅完成S7-300 PLC 型号为 315-2DP/PN HMI的型号是 智慧面板TP900 通过以太网进行连接.通过网络及连接 进行组态 PLC的程序 功能一 完成电动机的启动与停机 功能二 ...

  5. 西门子S7系列以太网通讯处理器安装调式操作

    北京华科远创科技有限研发的远创智控ETH-YC模块,PLC转以太网型号有MPI-ETH-YC01和MPI-ETH-YC01,适用于西门子S7-200/S7-300/S7-400.SMART S7-20 ...

  6. 【转】西门子PLC以太网 通讯协议 解析

    一直想把三菱和西门子这两个使用频率最高的PLC上位通讯,融合到WCS系统的框架里: 现在三菱主流使用Q系列,使用的是MC协议, 前一段时间也写过一个入门介绍: 三菱Q系列通讯方式设计说明 去年8月份, ...

  7. C/C++编程语言学习资料尽收眼底 电子书+视频教程

    Visual C++(VC/MFC)学习电子书及开发工具下载请看这里 史无前例的网络最全最强C/C++资料索引: C/C++编程语言学习资料尽收眼底 电子书+视频教程 VC++/MFC(VC6)开发技 ...

  8. 千兆以太网TCP协议的FPGA实现

    转自https://blog.csdn.net/zhipao6108/article/details/82386355 千兆以太网TCP协议的FPGA实现 Lzx 2017/4/20 写在前面,这应该 ...

  9. S7-200以太网通信

    一.西门子网络系统 二.s7-200通过以太网模块接入以太网 三.S7-200可以接入的以太网系统 四.S7-200以太网通讯实验 五.实验硬件系统组成 六.S7-200作为服务器的配置 1.进入以太 ...

随机推荐

  1. Linux修复文件系统

    注意:修复有风险,操作需谨慎.风险一定要说明啊! 由于还没遇到过,我就当网上找了一张图. 如果在启动时,出现了如上图红色框内的RUN fsck MANUALLY,那么一般是文件系统有问题. 最下面提示 ...

  2. asp.net core集成CAP(分布式事务总线)

    一.前言 感谢杨晓东大佬为社区贡献的CAP开源项目,传送门在此:.NET Core 事件总线,分布式事务解决方案:CAP 以及 如何在你的项目中集成 CAP[手把手视频教程],之前也在工作中遇到分布式 ...

  3. Redis学习篇(三)之Key相关操作

    KEYS 作用:返回所有的给定模式的key 语法:KEYS pattern 通配符: *: 任意个字符 ?: 任意一个字符 []: 匹配[]之间的字符 [a-z] [A-Z] \x: 匹配特殊字符 ? ...

  4. MySQL笔记(四)之内建函数

    AVG() 函数 AVG 函数返回数值列的平均值.NULL 值不包括在计算中. 语法: SELECT AVG(列) FROM 表: COUNT() 函数 COUNT() 函数返回匹配指定条件的行数. ...

  5. Linux下对拍脚本

    使用说明:        1. 被测代码.正确代码.生成器代码均使用文件输入输出: 2. 对拍前会清屏,请注意:        3. 输出文件的文件名请和代码文件名保持一致:        4. 若无 ...

  6. HDU 5514 Frogs(容斥原理)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5514 [题目大意] m个石子围成一圈,标号为0~m-1,现在有n只青蛙,每只每次跳a[i]个石子, ...

  7. 【带修改的主席树】BZOJ1901-Dynamic Rankings

    稍后整理笔记.这题数据范围好像有点问题? #include<iostream> #include<cstdio> #include<cstring> #includ ...

  8. 20162325 金立清 S2 W8 C17

    20162325 2017-2018-2 <程序设计与数据结构>第8周学习总结 教材学习内容概要 二叉查找树是一棵二叉树,对于其中的每个结点,左子树上的元素小于父结点的值,而右子树上的元素 ...

  9. Python 实现简单的感知机算法

    感知机 随机生成一些点和一条原始直线,然后用感知机算法来生成一条直线进行分类,比较差别 导入包并设定画图尺寸 import numpy as np import matplotlib.pyplot a ...

  10. Oracle简单脚本演示样例

    Oracle简单脚本演示样例 1.添加表 --改动日期:2014.09.21 --改动人:易小群 --改动内容:新增採购支付情况表 DECLARE VC_STR           VARCHAR2( ...