记我的毕业设计(一)
Socket实现客户端和服务器之间的通信
第一次做毕业设计也是我的第一篇博客,不知为何此刻显得特别神圣与庄重。我的毕业设计做的是用STM32F4采集开关柜的状态信息实现数据上网。具体的数据采集工作我将放到下一篇博客进行讲解。先贴出我的毕业设计的总体设计方案
本篇文章主要讲socket通信。为了学习socket通信还是在网上参考了很多关于这方面的文章,我对于socket的学习分为两个阶段。第一个阶段是当时做大创需要,用socket实现数据上网,由于时间比较慌张心态也有点不好。所以感觉并没有太大的收获。第二个阶段是一个月之后的毕业设计这次我看了传智播客的关于c#语言的课程,其中刚好有讲到socket通信部分,感觉收获很大。
Socket理解
为什么要选择socket进行网络通信,要解决这个问题首先要弄清楚socket究竟是什么,它的作用是怎样的呢?关于socket的定义已经有很多文章有过详细的讲解,这里我就结合自身感受说一下我对于它的理解,如果有不对的地方希望各位读者积极给我指出。socket我的理解是一种网络的通信工具,它包含了很多通信协议,如:TCP/UDP等。它将很多网络的基础协议封装在其中,使用者不需要进行复杂的配置过程,只需要进行选择即可。如下面代码所示:
// 用以指定socket通信的协议
Socket socketWatch=new Socket(AddressFamily.InterNetwork,SocketType .Stream , ProtocolType.Tcp );
这里我选择的是以数据流的方式进行通信,选择的是TCP协议。
Socket异步通信的重要说明
在我第一阶段的学习过程中从CSDN上着了很多关于socket的例程来看,虽然通过这样的不断学习知道了socket通信的基本原理,但是晚上的例程大多讲的都是同步通信,而实际生产生活过程中要想实现类似于QQ一样的通信就必须使用异步通信来实现。这里我贴上socket通信的原理图,从图中来说明怎样具体实现异步通信的功能。
如上所示是socket通信原理图,如果要实现socket之间的相互收发就必须在双方建立起连接之后使得read函数一直处于监听状态,write函数在相应事件下执行,这样便可以实现双方之间一直通信。
在上述过程中如果是用c#语言进行编程,则需要使用到多线程。服务器端需要设置两个后台线程,一个用于监听连接,一个用于实现接收消息。代码如下:
// 监听连接
Thread th = new Thread(Listen);
th.IsBackground = true;
th.Start(socketWatch);
void Listen(