python基础教程总结13——网络编程,
1.网络设计模块
1.1 socket模块
在网络编程中的一个基本组件就是套接字(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网络框架,原来是为网络游戏开发的,现在被所有类型的网络软件使用。