1.网络设计模块
1.1 socket模块
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套 接字的地址和端口号,然后就向服务器端套接字提出连接请求。
3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户 端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
在网络编程中的一个基本组件就是套接字(socket)。套接字主要是两个程序之间“信息通道”。程序可能(通过网络连接)分布在不同的计算机上,通过套接字相互发送信息。在Python中的大多数的网络编程都隐藏了socket模块的基本细节,并且不直接和套接字交互。
套接字包括两个:服务器套接字和客户端套接字。创建一个服务器套接字后,让它等待连接。这样它就在某个网络地址处(ip地址和一个端口号的组合)监听。处理客户端套接字通常比处理服务器套接字容易,因为服务器必须准备随时处理客户端的连接,同时还要处理多个连接,而客户端只是简单的连接,完成事务,断开连接。
一个套接字就是一个socket模块中的socket类的实例。有三个参数:
第一个是地址族(默认是socket.AF_INET);
第二个参数是流(默认是socket.SOCK_STREAM,默认值)或数据报(socket.SOCK_DGRAM)套接字;
第三个参数是使用的协议(默认是0,使用默认值即可)。对于一个普通的套接字,不需要提供任何参数。
服务器端套接字使用bind方法后,再调用listen方法监听这个给定地址。客户端套接字使用connect方法连接到服务器在connect方法中使用的地址与bind方法中的地址相同。在这种情况下,一个地址就是一个格式为(host,port)的元组,其中host是主机名,port是端口号。Listen方法只有一个参数,即服务器未处理的连接的长度。
服务器套接字开始监听后,它就可以接受客户端的连接。这个步骤使用accept方法来完成。这个方法会堵塞(等待)直到客户端连接,然后该方法就返回一个格式为(client,address)的元组。服务器能处理客户端到它满意的程度,然后调用一个accept方法开始等待下一个连接。这个过程通常都是在一个无限循环中实现的。
套接字有两个方法:send和rev,用于传输数据。可以使用字符串参数调用send以发送数据,用一个所需的(最大)字节数做参数调用recv来接收数据。如果不能确定使用哪个数字比较好,那么1024是个很好的选择。
1 #小型服务器 2 import socket 3 s=socket.socket() 4 host=socket.gethostname() 5 port=1234 6 s.bind((host,port)) 7 s.listen(5) 8 while True: 9 c,addr = s.accept() 10 print "Got connect from",addr 11 c.send(‘tkx for connecting‘) 12 c.close() 13 14 15 #小型客户端 16 17 import socket 18 s=socket.socket() 19 host=socket.gethostname() 20 port=1234 21 s.connect((host,port)) 22 print s.recv(1024)
1.2 urllib和urllib2模块
在能使用的各种网络工作库中,功能最强大的是urllib和urllib2。它们能让通过网络访问文件,就像那些文件存在于你电脑上一样。通过一个简单的函数调用,几乎可以把任何URL所指向的东西用作程序的输入。这两个模块功能差不多,但urllib更好一些。如果只使用简单的下载,urllib就足够了。但如果需要使用HTTP验证或cookie或者要为自己的协议写扩展程序的话,urllib2是个好的选择。
1)打开远程文件
#打开远程文件 >>> from urllib import urlopen >>> webpage=urlopen("http://blog.csdn.net/signjing")
Urlopen返回的类文件对象支持close、read、readline和readlines方法,当然也支持迭代。
2)获取远程文件
函数urlopen提供一个能从中读取数据的类文件对象。如果希望urllib为你下载文件并在本地文件存在一个文件的副本,那么可以使用urlretrieve。
Urlretrieve返回一个元组(filename,headers)而不是类文件对象,filename是本地文件的名字(由urllib自动创建),headers包含一些远程文件的信息。
>>> import urllib >>> urllib.urlretrieve(‘http://www.baidu.com‘,‘d:\\baidu.html‘) (‘d:\\baidu.html‘, <httplib.HTTPMessage instance at 0x02BFC788>)
如果没有指定文件名,文件会放在临时的位置,用open函数可以打开它。完成了对它的操作,就可以删除它以节省空间,要删除临时文件,可以用urlcleanup函数,不需要提供参数。
1.3 其他模块
模块 |
描述 |
asynchat |
asyncore的增强版本 |
asyncore |
异步套接字处理程序 |
cgi |
基本的CGI支持 |
Cookie |
Cookie对象操作,主要用于服务器 |
cookielib |
客户端cookie支持 |
|
Email消息支持 |
ftplib |
FTP客户端模块 |
gopherlib |
gopher客户端模块 |
httplib |
http客户端模块 |
imaplib |
imap4客户端模块 |
mailbox |
读取几种邮箱的格式 |
mailcap |
通过mailcap文件访问MIME配置 |
mhlib |
访问MH邮箱 |
nntplib |
NNTP客户端模块 |
poplib |
pop客户端模块 |
robotparser |
支持解析web服务器的robot文件 |
SimpleXMLRPCServer |
一个简单的xml-rpc服务器 |
smtpd |
smtp服务器端模块 |
smtplib |
smtp客户端模块 |
telnetlib |
telnet客户端模块 |
urlparse |
支持解释url |
xmlrpclib |
xml-rpc的客户端支持 |
2. SocketServer
SocketServer模块是标准库中很多服务器框架的基础。SocketServer包含了4个基本的类:针对TCP套接字流的TCPServer;针对UDP数据报套接字的UDPServer;以及针对性不强的UnixStreamServer和UnixDatagramServer。
3. 多连接
到目前为止讨论的服务器解决方案都是同步的:即一次只能连接一个客户端并处理它的请求。怎么样同时处理多个连接呢?
三种方法:分叉(forking)、线程(threading)以及异步I/O(asynchronous I/O)。
4. Twisted
Twisted是一个事件驱动的python网络框架,原来是为网络游戏开发的,现在被所有类型的网络软件使用。