对于事件和委托机制不够理解的读者可以参考本节提供的委托相关的范例程序,这个是控制台的程序,比较简洁(书店发布一本书的事件注册到某个读者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. PBR Step by Step(一)立体角

    转载请注明出处:http://www.cnblogs.com/jerrycg/p/4924761.html  本系列从零起步,作为学习笔记与大家分享,从基础的数学和图形理论,一步一步实现基于物理的渲染 ...

  2. FastReport.Net使用:[36]"续表"

    1. RepeatedBand的打印和子报表的使用. RepeatedBand实现方法:设置Band为每页重复.注意,从第二次打印开始,就是重复打印了.第一次打印不认为是RepeatedBand. 报 ...

  3. 2016 湖南省省赛B题《有向无环图》

    题目链接[https://vjudge.net/problem/CSU-1804] 题意: 给出一个有向无环图,然后让你算下面的结果,count(i,j)表示i->j之间的路径条数. 题解: 根 ...

  4. android 进程优先级

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 前台进程 可见进程 服务进程 后台进程 空进程

  5. [SimpleOJ236]暴风雨

    题目大意: 给你一棵n个点的树,以及m+q条信息. m条描述点a到b有边直接相连. q条描述点a和点b的LCA为c. 问有多少符合条件的以1为根的树. 思路: 状压DP. e[i]记录需要与点i直接相 ...

  6. org.apache.curator:master选举和分布式锁

    1. master选举(LeaderSelector) 1)LeaderSelector构造函数 在leaderPath上建立分布式锁:mutex = new InterProcessMutex(cl ...

  7. Spring 如何读取properties文件内容

    http://hi.baidu.com/alizv/blog/item/d8cb2af4094662dbf3d38539.html 在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配置 ...

  8. 如何注入值到Spring bean属性

    在Spring中,有三种方式注入值到 bean 属性. 正常的方式 快捷方式 “p” 模式 看到一个简单的Java类,它包含两个属性 - name 和 type.稍后将使用Spring注入值到这个 b ...

  9. gdb -Mysql源代码级调试方法

    http://blog.csdn.net/hitzhang/article/details/5985474 gdb -q --batch --ex "set height 0" - ...

  10. set是无序集合,放入set中的元素通过iterator输出时候是无序的

    set是无序集合,放入set中的元素通过iterator输出时候是无序的 HashMap<String , String> hashMap = new HashMap<String ...