异步Socket工作原理:
以接收一条消息说明问题。首先,程序向系统投递一个接收数据的请求,并为其指定一个数据缓冲区和回调函数,回调函数用来指示当数据到达后将如何处理。当有数据到达的时候,系统将数据读入缓冲区,并执行回调函数,处理这条消息。不需要关心这条消息何时到达。
异步比同步的性能低:1、客户端Socket。2、服务端连接数比较少。3、连接数很多,但都是短连接。
Socket是什么:
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。
服务器端先初始化Socket,然后与端口绑定(bind),进行端口监听(listen),调用accept阻塞,等待客户端连接。此时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,客户端与服务器端建立了连接。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
端口号:1到255 之间的号码被用于远程应用程序所请求的进程和网络服务;每个网络通信循环地进出主计算机的TCP 应用层,它被两个所连接的号码(套接字)唯一地识别;组成套接字的两个号码就是机器的IP 地址和TCP 软件所使用的端口号。
套接字的三种类型
流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM)及原始套接字(RAW)。
流式套接字(SOCK_STREAM)
流式的套接字可以提供可靠的、面向连接的通讯流。
Telnet 应用程序、BBS服务、以及系统的远程登陆都是通过Telnet 协议连接的。Telnet 就是一个流式连接。WWW 浏览器,使用的HTTP 协议也是通过流式套接字来获取网页的。
数据报套接字(SOCK_DGRAM)
数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。
数据报套接字使用IP,使用数据报协议UDP(User Datagram Protocol)
“无连接”:(UDP)不像流式套接字那样维护一个打开的连接,你只需要把数据打成一个包,把远程的IP 贴上去,然后把这个包发送出去。不需要建立连接的。
UDP 的应用例子有: tftp, bootp 等。
每个使用UDP的程序都要有自己的对数据进行确认的协议。
TFTP 协议定义了对于每一个发送出去的数据包,远程在接受到之后都要回送一个 “ACK” 包。如果在5 秒内没有的得到回应,就会重新发送这个数据包直到数据包接受者回送了 “ACK” 信号。这些知识对编写一个使用UDP 协议的程序员来说是非常必要的。
无连接服务器一般都是面向事务处理的,一个请求一个应答就完成了客户程序与服务程序之间的相互作用。
套接字工作过程如下:
服务器首先启动
通过调用socket()建立一个套接字,
然后调用bind()将该套接字和本地网络地址联系在一起,
再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,
之后就调用accept()来接收连接。
客户再建立套接字
然后就可调用connect()和服务器建立连接。
客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。
最后,待数据传送结束后,双方调用close()关闭套接字。
对流式套接字只是调用send() 函数来发送数据。对于数据报套接字,需要自己加个信息头,然后调用sendto() 函数把数据发送出去。
Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序。
.Net类可以视为包含3个层次:请求/响应层、应用协议层、传输层。WebReqeust和WebResponse 代表了请求/响应层,支持Http、TCP和UDP的类组成了应用协议层,而Socket类处于传输层。
在Internet中,TCP/IP 使用一个网络地址和一个服务端口号来唯一标识设备。网络地址和服务端口的组合称为终结点,在.NET 框架中正是由 EndPoint 类表示这个终结点,它提供表示网络资源或服务的抽象,用以标志网络地址等信息。.Net为每个受支持的地址族定义了 EndPoint 的子代;对于 IP 地址族,该类为 IPEndPoint。IPEndPoint 类包含应用程序连接到主机上的服务所需的主机和端口信息,通过组合服务的主机IP地址和端口号,IPEndPoint 类形成到服务的连接点。
Socket 类支持两种基本模式:同步和异步。其区别在于:在同步模式中,对执行网络操作的函数(如 Send 和 Receive)的调用一直等到操作完成后才将控制返回给调用程序。在异步模式中,这些调用立即返回。