在网络编程中,异步通讯和同步通讯的区别
下面,用一个例子来解释同步通讯和异步通讯的根本区别。
假定一个服务器应用程序在指定端口监听客户端发送来的数据。在同步通讯接收中,当服务器等待从客户端接收数据时,如果流没有数据,那么,主线程会阻塞,直到数据请求得到。因此,在这段时间,服务器端不能进行任何工作,直到接收到该客户端的数据。如果此时,另一个客户端需要连接服务器,由于服务器阻塞在第一个客户端上,所以,不能接收新的请求。对于需要同时支持多台客户端的现实应用中,这个方法显然是不可取的。
在异步通讯中,当服务器端监听或接收客户端数据时,仍然可以处理其他客户机的请求或接收数据。当服务器异步接收时,Socket事件触发,则一个单独的线程监听Socket,并且会引发一个回调(callback)函数(在异步监听刚刚开始的时候引发)。这个回调函数会依次的响应,并处理Socket事件。例如,远端程序在socket中写入了一些数据,一个“读取数据事件”(自定义的回调函数)会触发,该事件知晓如何从socket中读取数据。
虽然异步通讯可以通过使用多线程来实现,但c#和.NET frameworks提供了一系列的方法来实现异步通讯,而不需要使用复杂的线程的知识。
Socket类
Socket类(System.Net.Sockets.Socket)提供了一系列同步和异步通讯的方法。在.NET命名协议中,所有的异步方法名都是以“Begin”或“End”作为同步方法名的前缀。以“Begin”或“End”为前缀的方法名,表示与同步通讯方法名相对应的一对异步通讯方法。如下所示。同步通讯方法 | 异步通讯方法 |
Connect() | BeginConnect(), EdnConnect() |
Receive() | BeginReceive(), EndReceive() |