网络编程前奏(三)
讲了不少理论,相信你快烦了吧,不过,别急,还要沉着气,把本节学完,就能开始进行网络编程了。
农村有句话叫,沉着气不少打粮食。学习知识亦是如此。
一,套接字前世今生
系统调用,就是应用进程的控制权和操作系统的控制权进行转换的一个接口。
TCP/IP协议软件已驻留在操作系统中,由于此协议族被设计为运行在多种系统中,因此TCP/IP允许系
统设计者自己选择相关API,具体实现细节。这里最著名的就是美国加利福尼亚伯克利分校为Berkeley UNI
X操作系统定义的一种API,它又称套接字接口(socket interface),微软公司在其操作系统中才用了套接字接
口API,形成了一个稍有不同的API,并称之为Windows Socket,简称WinSock。
网络通信,换个角度来看,就是本计算机要读取另一地点的计算机的数据,或者要把数据从本计算机写入
到另一地点的计算机中。“读取”,“写入”都要用到系统调用。
网络编程时常常把套接字作为应用进程和运输层协议之间的接口,如下图表示这一概念,图中假定了运输
层使用TCP协议(UDP类似),套接字已成为计算机内核的一部分。
套接字以上的进程受应用程序控制的,而套接字以下的运输层协议软件是受计算机操作系统控制。因此,只
要应用程序使用TCP/IP协议进行通信,它就必须通过套接字与操作系统交互并请求其服务。开发者对套接字以上
的进程完全控制,对套接字以下的进程却只有很少的控制,例如可以选择运输层协议等。
当应用进程需要使用网络通信时,必须首先发出socket系统调用,请求系统为其创建一个“套接字”。这个调
用本质是请求系统把网络通信所需的一些系统资源(如存储空间,CPU时间,网络带宽等)分配给该应用进程。系统
为这些资源的总和用一个叫做套接字描述符的号码(小整数)来表示,然后把这个套接字描述符返回给应用进程。此后,
应用进程所进行的网络操作(建立连接,收发数据,调整通信参数等)都必须使用这个套接字描述符。所以,几乎所
有的网络系统调用都把这个套接字描述符作为套接字许多参数中的第一个参数。在处理系统调用时,通过套接字描述
符,操作系统可以识别出应该使用哪些资源来完成应用进程所请求的服务。通信结束后应用进程通过一个close系统调
用通知操作系统回收与该套接字描述符相关的所有资源。由此可见,套接字是为了获得网络服务而与操作系统进行交互
时使用的一种机制。
二,WinSocket与.net中Socket类
.net中socket
msdn曾这样注解:实现 Berkeley 套接字接口。
个人理解:它是.net对winsocket的一种封装,就如.net对windows api的其它封装一样,是开发者调用更简单,更
方便。
三,.net网络通信常用类
在.net自动化测试中,关于HTTP请求和相应测试,共有五种方法,其中三中基本方法和两种低层的方法,下面我们按照
从最容易使用但是最不灵活,到最不容易使用但最为灵活的顺序,列出发送和取回HTTP数据的五种方法。
1.WebClient:使用极为简单,但是不能发送认证信息,在.net3.5中,使用它只能访问web服务器和ftp服务器
WebClient类在后台使用WebRequest和WebResonse。
2.WebRequest-WebResponse:更大的灵活性,包括发送认证信息的能力,是HttpWebRequest
和HttpWebResponse的抽象基类。提供共有的属性。
3.HttpWebRequest-HttpWebResponse(同级别的还有HttpListener,FTP...):提供对Http协议特有数据的一些控制,
更为复杂,更多控制能力。
4.TcpClient(同级别的还有TcpListener,UDPClient,UDPListener):轻量级自动化测试中,很少用
如需要创建服务器,可以使用TCPListener类,TCPListener类可以用于为TCP协议创建一个服务器。
5.Socket:非常低层的一个类,自动化测试程序里不常用到。
如果要独立于协议,或需要对TCP和UDP协议进行更多的控制,
本文只是拿自动化测试举例,说明.net网络通信中从灵活到不灵活,使用简单到使用复杂大体结构的一些类。