天天看点

Socket编程 (异步通讯) (Tcp,Udp) - Part2Socket编程(异步通讯)(Tcp,Udp)

  上一章主要展示了Socket的Tcp\Udp两种协议下的基本通讯方式,属于同步通讯。至于一个服务器对应多个客户端,或者对应多个请求,我们采用的是多线程的方式来解决此问题。然而本章节我们将有更好的方式去实现它:Socket在Tcp\Udp两种协议下的异步通讯方式。

基于Tcp协议异步:

  BeginAccept方法和EndAccept方法

  包含在System.Net.Sockets命名空间下。异步Tcp使用BeginAccept方法开始接受新的客户端连接请求,该方法中系统自动利用线程池创建需要的线程,并在操作完成时利用异步回调机制调用提供给它的方法,同时返回相应的状态参数,然后方可利用EndAccept方法结束该连接请求.

  BeginRecive方法和EndRecive方法

  异步Tcp使用BeginRecive方法和开始接受客户端发送的的消息,该方法如上同理,接受完毕后调用回调函数传递相应的状态参数。利用EndRecive方法接受接受消息。

  至于BeginSend方法和EndSend方法、BeginConnect方法和EndConnect方法与上类似。

下面我们来看看如何在Tcp协议下进行客户端与服务器端之间的通讯:

服务器端:  

Socket编程 (异步通讯) (Tcp,Udp) - Part2Socket编程(异步通讯)(Tcp,Udp)
Socket编程 (异步通讯) (Tcp,Udp) - Part2Socket编程(异步通讯)(Tcp,Udp)

客户端:

Socket编程 (异步通讯) (Tcp,Udp) - Part2Socket编程(异步通讯)(Tcp,Udp)
Socket编程 (异步通讯) (Tcp,Udp) - Part2Socket编程(异步通讯)(Tcp,Udp)

通讯效果如下图:

服务器:

Socket编程 (异步通讯) (Tcp,Udp) - Part2Socket编程(异步通讯)(Tcp,Udp)
Socket编程 (异步通讯) (Tcp,Udp) - Part2Socket编程(异步通讯)(Tcp,Udp)

上面我们完成了基于Tcp协议下的Socket通讯,那么Udp协议下的通讯我们将以什么样的形式来通讯呢?毕竟Udp协议下是无连接模式。

基于Udp协议的异步通讯:

  其实与Tcp协议具有的方法类似,但由于Udp协议是无连接模式,我们所用到方法就无BeginConnect和EndConnect方法。我们所要做的就是收发消息的处理。

  在Udp协议的异步通讯中,我们需要注意一下几个编程点:

  1.在EndRecive方法中,由于无状态返回模式,不能返回发送端的Remote,所以我们需要在该方法中获取活动端的Remote,然后利用EndRecive方法结束接受该消息接受。

  2.客户端由于无需Connect到服务器端,但是需要先向服务器端发送一个请求如Send一些消息。让服务器端确定自己Remote,然后可利用Recive方法接收其他终端发送过来的消息。

下面将演示Udp协议下异步通讯:

服务器端:

Socket编程 (异步通讯) (Tcp,Udp) - Part2Socket编程(异步通讯)(Tcp,Udp)
Socket编程 (异步通讯) (Tcp,Udp) - Part2Socket编程(异步通讯)(Tcp,Udp)
Socket编程 (异步通讯) (Tcp,Udp) - Part2Socket编程(异步通讯)(Tcp,Udp)
Socket编程 (异步通讯) (Tcp,Udp) - Part2Socket编程(异步通讯)(Tcp,Udp)
Socket编程 (异步通讯) (Tcp,Udp) - Part2Socket编程(异步通讯)(Tcp,Udp)
Socket编程 (异步通讯) (Tcp,Udp) - Part2Socket编程(异步通讯)(Tcp,Udp)

总结:基于异步模式的通讯无须采用多线程来服务多个客户端以及多个请求,这样的通讯模式效率更高。

  同步上面Tcp效果展示图,我们发现客户端分几次连续发送的消息被服务器端一次接收了,读成了一条数据,而这就是Socket通讯基于Tcp协议下发生的粘包问题,下面一种我们将着重对Tcp协议的通讯信息封包,拆包以解决上面问题。

  同样Udp协议通讯下属于无连接模式通讯,客户端只管将消息发送出去,或者由于网络原因,而造成的丢包问题,下一章也将采用一定的方式解决。