对于事件和委托机制不够理解的读者可以参考本节提供的委托相关的范例程序,这个是控制台的程序,比较简洁(书店发布一本书的事件注册到某个读者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. Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机

    Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现的 ...

  2. 「CSA49」Bunny on Number Line

    「CSA49」Bunny on Number Line 题目大意:有一个人从0开始走,每次可以向前走一步或者回到1,那么会产生一个位置序列,其中给出 \(k\) 个位置是好的.定义一个位置序列是好的, ...

  3. Android Studio NDK开发浅谈

    环境: Android Studio 1.1.0 NDK-r10d 1.新建项目--->包名:com.mxl.az.ndk 新建包含native方法的类:JniOperation.class p ...

  4. Codeforces Beta Round #80 (Div. 1 Only) D. Time to Raid Cowavans 分块

    D. Turtles Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/103/problem/D ...

  5. window10下java环境变量的配置 javac不是内部或外部命令的问题

    http://blog.csdn.net/suncold123/article/details/48392135 参考与上面这个博主. 今天在win10下重新配置了一下java环境变量.跟着网上的流程 ...

  6. tomcat使用Eclipse进行远程调试(线上调试)

    什么是远程调试,就是在A机器上利用Eclipse单步跟踪调试B机器上的Web应用,当然调试A机器上Web应用也是没有问题的,90%我都是调试本机的Web应用,远程调试的意义我想我不用说了,大家都会想到 ...

  7. HP-unix如何生成动态库?

    HP-unix系统生成动态库编译的方法? 创建PIC中间文件的编译器选项是+z,创建动态库的链接器标志是-b. 1. cc +z d1.c d2.c /* 编译以".o"为扩展名的 ...

  8. php获取开始与结束日期之间所有日期的方法

    /** * 获取指定日期段内每一天的日期 * @param Date $startdate 开始日期 * @param Date $enddate 结束日期 * @return Array */ fu ...

  9. Windows UWP开发系列 – 控件默认样式

    今天用一个Pivot控件的时候,想修改一下它的Header样式,却发现用Blend和VS无法导出它的默认样式了,导致无法下手,不知道是不是Blend的bug. 在网上搜了一下,在MSDN上还是找到了它 ...

  10. Spring JdbcTemplate batchUpdate() 实例

    在某些情况下,可能需要将一批记录插入到数据库中.如果你对每条记录调用一个插件的方法,SQL语句将被重复编译,造成系统缓慢进行. 在上述情况下,你可以使用 JdbcTemplate BATCHUPDAT ...