C#应用视频教程1.4 实现完整以太网通讯
对于事件和委托机制不够理解的读者可以参考本节提供的委托相关的范例程序,这个是控制台的程序,比较简洁(书店发布一本书的事件注册到某个读者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
C#应用视频教程1.4 实现完整以太网通讯的更多相关文章
- STM32F412应用开发笔记之五:结合W5500实现以太网通讯
因实际使用需求我们测试一下网络通讯,在NUCLEO-F412ZG测试板上没有以太网部分,我们选择外接一个W5500的实验板.W5500支持SPI接口通讯,DC3.3V供源.而NUCLEO-F412ZG ...
- 西门子S7系列以太网通讯处理器功能介绍
北京华科远创科技有限研发的远创智控型号ETH-YC模块适用于西门子S7-200/S7-300/S7-400.SMART S7-200.西门子数控840D.840DSL.合信.亿维PLC的PPI/MPI ...
- 西门子S7200/300/400以太网通讯处理器选型分类
北京华科远创科技有限研发的远创智控转以太网模块适用于西门子S7-200/S7-300/S7-400.SMART S7-200.西门子数控840D.840DSL.合信.亿维PLC的PPI/MPI/PRO ...
- 博途V13 仿真S7-300PLC 与HMI 的以太网通讯。实现简单功能 HMI 型号是TP900
本项目仅完成S7-300 PLC 型号为 315-2DP/PN HMI的型号是 智慧面板TP900 通过以太网进行连接.通过网络及连接 进行组态 PLC的程序 功能一 完成电动机的启动与停机 功能二 ...
- 西门子S7系列以太网通讯处理器安装调式操作
北京华科远创科技有限研发的远创智控ETH-YC模块,PLC转以太网型号有MPI-ETH-YC01和MPI-ETH-YC01,适用于西门子S7-200/S7-300/S7-400.SMART S7-20 ...
- 【转】西门子PLC以太网 通讯协议 解析
一直想把三菱和西门子这两个使用频率最高的PLC上位通讯,融合到WCS系统的框架里: 现在三菱主流使用Q系列,使用的是MC协议, 前一段时间也写过一个入门介绍: 三菱Q系列通讯方式设计说明 去年8月份, ...
- C/C++编程语言学习资料尽收眼底 电子书+视频教程
Visual C++(VC/MFC)学习电子书及开发工具下载请看这里 史无前例的网络最全最强C/C++资料索引: C/C++编程语言学习资料尽收眼底 电子书+视频教程 VC++/MFC(VC6)开发技 ...
- 千兆以太网TCP协议的FPGA实现
转自https://blog.csdn.net/zhipao6108/article/details/82386355 千兆以太网TCP协议的FPGA实现 Lzx 2017/4/20 写在前面,这应该 ...
- S7-200以太网通信
一.西门子网络系统 二.s7-200通过以太网模块接入以太网 三.S7-200可以接入的以太网系统 四.S7-200以太网通讯实验 五.实验硬件系统组成 六.S7-200作为服务器的配置 1.进入以太 ...
随机推荐
- Arduino可穿戴教程之第一个程序——连接硬件选择板子(二)
Arduino可穿戴教程之第一个程序——连接硬件选择板子(二) 2.4.2 连接硬件 在选择好示例程序后就可以将LilyPad通过LilyPad编程器连接到电脑了. 2.4.3 选择板子 如果你了 ...
- POJ2955【区间DP】
题目链接[http://poj.org/problem?id=2955] 题意:[].()的匹配问题,问一个[]()串中匹配的字符数,匹配方式为[X],(X),X为一个串,问一个长度为N(N<= ...
- 【BZOJ 4229】 4229: 选择 (线段树+树链剖分)
4229: 选择 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 67 Solved: 41 Description 现在,我想知道自己是否还有选择. ...
- 2017-2018-1 JAVA实验站 第四、五周作业
2017-2018-1 JAVA实验站 第四.五周作业 JAVA实验站小组成员 学号 名字 职务 20162318 张泰毓 组长 20162303 石亚鑫 组员 20162304 张浩林 组员 201 ...
- div块元素垂直水平居中方法总结
1.已知块级元素的宽和高,使用绝对定位+外边距设定水平垂直居中. 父元素position:relative,子元素position:absolute;top:50%;left:50%;margin-t ...
- Java并发(十四):并发工具类——CountDownLatch
先做总结: 1.CountDownLatch 是什么? CountDownLatch 允许一个或多个线程等待其他线程(不一定是线程,某个操作)完成之后再执行. CountDownLatch的构造函数接 ...
- Google图片和NASA 网站图片的爬虫
1.根据关键字爬取NASA网站上的图片 首先针对需要爬取的网站进行分析,输入关键字查找需要的内容 通过关键字请求,网页每次会加载20张的缩略图,分析网页源码能够很容易的找到缩略图的url: 然后再点开 ...
- [转]Android:Activity+Fragment及它们之间的数据交换(一)
2014-05-18 来源:Android:Activity+Fragment及它们之间的数据交换(一) 简介: 为什么要用Fragment?使用Fragment可以在一个Acti ...
- Codeforces Round #302 (Div. 2) A. Set of Strings 水题
A. Set of Strings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/544/pr ...
- linux下如何启动sybase
isql -Dxxx -Uxxx -P111111 用isql连接数据库发现数据库没有启动. 如何启动sybase数据库? [TA_SYBASE][/home/bta]su - sybase //切 ...