《2022年Python网络编程 .pdf》由会员分享,可在线阅读,更多相关《2022年Python网络编程 .pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Python网络编程Python 内置封装了很多常见的网络协议的库,因此Python 成为了一个强大的网络编程工具,这里是对Python 的网络方面编程的一个简单描述。1. 常用的网络设计模块在标准库中有很多网络设计相关的模块,除了那些明确处理网络事务的模块外,还有很多模块也是是和网络相关的,下面是几个常用的网络设计模块:1.1 socket 模块socket模块是网络编程中的基础组件。socket 主要的作用就是作为两个程序之间的“ 通信信道 ” , 不同进程 (不同主机 )可以通过 socket 相互发送信息, 以达到网络通信的目的。socket 包括两个部分: 服务端和客户端。 服务端监
2、听端口号, 等待客户端发送的消息;而客户端在需要发送信息是,连接服务端,将信息发送出去即可。下面是一个简单的同步网络编程的简单示例:#这是 Socket Server 部分:import sockets = socket . socket () host = socket .gethostname() port = 8088 s. bind (host,port) s. listen(5) while True: c, addr = s. accept () printGot connection from, addr c.send( Thank you for connection) c.c
3、lose ()#这是 Socket Client 部分:import socket名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 10 页 - - - - - - - - - s = socket . socket () host = socket .gethostname() port = 8088 s. connect (host,port) prints. recv (1024) 运行时, 请将对应的端口 (这里是 8088) 添加到防火墙的InBound和 Out
4、Bound的规则中。1.2 urllib 和 urllib2 模块urllib和urllib2是 Python 标准库中最强的的网络工作库。通过这两个库所提供的上层接口,使我们可以像读取本地文件一样读取网络上的文件。而且urllib2并不是urllib的升级版本 (应该是一种补充 ),二者是不可相互替代的。通过使用urllib的urlopen函数可以很容易的打开远程的文件,如下:from urllib import urlopen webpage = urlopen(http:/ txt = webpage.readline(45) print txt # !DOCTYPE html PUBL
5、IC -/W3C/DTD XHTML 1.0 也可以通过在通过在路径的前面添加file:来访问本地文件:from urllib import urlopen webpage = urlopen(rfile:D:Hsr23updADD_ABBR.txt) txt = webpage.readline(45) print txt 如果你还可以通过urllib提供的urlretrieve函数,来直接保存远程文件副本:from urllib import urlretrieve 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整
6、理 - - - - - - - 第 2 页,共 10 页 - - - - - - - - - webpage = urlretrieve(http:/ print type(webpage ) # 1.3 其他与网络相关的模块除了 socket 、urllib和 urllib2这些模块以外标准库还有很多和网络相关的模块,下面的列表是其中的一部分:=模块描述=asynchat asyncore的增强版本asyncore 异步 socket 处理程序cgi 基本的 CGI支持Cookie Cookie对象操作,主要用于服务器操作cookielib 客户端 cookie 支持email E-mail
7、消息支持 (包括 MIME) ftplib FTP客户端模块gopherlib gopher客户端博客httplib HTTP客户端模块imaplib IMAP4客户端模块mailbox 读取几种邮件的格式mailcap 通过 mailcap 文件访问 MIME配置mhlib 访问 MH邮箱nntplib NNTP客户端模块poplib POP客户端模块robotparser 支持解析 Web服务器的 robot 文件名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 10
8、页 - - - - - - - - - SimpleXMLRPCServer 一个简单的 XML-RPC 服务器stmpd SMTP服务器模块smtplib SMTP客户端模块telnetlib Telnet客户端模块urlparse 支持解析 URL xmlrpclib XML-RPC的客户端支持2. SocketServer SocketServer 模块是标准库中很多其他服务器框架的基础,这些服务器框架包括:BaseHTTPServer 、SimpleHTTPServer、CGIHTTPServer 、SimpleXMLRPCServer和DocXMLRPCServer, 这些服务框架都
9、是在基础框架上增加了特定的功能。SocketServer包含了 4 个基本的类:TCPServer ,针对 TCP 的 Socket UDPServer ,针对 UDP 数据报的 Socket UnixStreamServer UnixDatagramServer 下面是一个基于SocketServer 的简单 Socket Server 端示例:from SocketServer import TCPServer, StreamRequestHandler classHandler (StreamRequestHandler): def handle (self): addr = self.
10、request.getpeername() self.wfile.write(Thank you for connectiong) server = TCPServer( ,8088),Handler) server.serve_forever()3. 多连接一般情况下Socket 中的 Client 端常常不止一个, 想要使 Socket Server 端能同时处理多个 Client 的连接一般由三种主要的方法:分叉(forking)(windows 不支持 ) 线程(threading) 异步 I/O(asynchronous I/O) 3.1 使用分叉名师资料总结 - - -精品资料欢迎
11、下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 10 页 - - - - - - - - - 分叉 (fork) 是一个 UNIX 术语;当分叉一个进程(一个运行的程序 )时,基本上时复制了它,并且分叉后的两个进程都从当前执行的点继续运行,并且每个进程都有自己的内存副本。一个进程 (开始的那个 )成为另一个进程的(复制的,也就是子进程)的父进程。在一个使用分叉的服务器中,每个客户端连接都利用分叉创建一个子进程。父进程继续监听连接,同时子进程处理客户端。当客户端的请求结束时,子进程退出。分叉的进程是并行执行的
12、,客户端直接不必相互等待。分叉的缺点是比较耗费资源(每个分叉出来的进程都需要自己的内存)。下面是一个使用分叉创建Socket 服务端的示例:# -coding:utf-8-# 使用了分叉 (fork),Windows系统不支持from SocketServer import TCPServer, ForkingMixIn, StreamRequestHandler classServer (ForkingMixIn, TCPServer):passclassHandler (StreamRequestHandler): def handle (self): addr = self.reques
13、t.getpeername() printGot connection from, addr self.wfile.write(Thank you for connectiong) server = Server( ,1234),Handler) server.serve_forever()3.2 使用线程线程是轻量级的进程或子进程,所有的线程都存在于相同的进程(一个运行的程序 )中,且共享内存。虽然使用多线程相对于分叉占用的资源较少,但是由于共享内存,所有必需要确保它们的变量不会冲突,或者是同一时间修改同一内容,这样会造成混乱。这些问题可以归结为同步问题。下面是使用多线程的一个简单示例:#
14、-coding:utf-8-名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 10 页 - - - - - - - - - # 使用多线程from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler classServer (ThreadingMixIn,TCPServer):passclassHandler (StreamRequestHandler): def handle (self)
15、: addr = self.request.getpeername() printGot connection from, addr self.wfile.write(Thank you for connection) server = Server( ,1234),Handler) server.serve_forever()3.3 带有select 和 poll 的异步 I/O 在 Python 中的异步 I/O 的基础就是select模块的select函数。标准库中的asyncore和asynchat模块对它们进行了进一步的包装,可以从更高层次来处理异步 I/O 。poll函数和sele
16、ct函数一样,也属于select模块,这两个函数的功能基本一样,相对而言poll的伸缩性更好,但其职能在UNIX 系统使用使用。select函数需要3 个序列作为它的必选参数(输入、输出、异常情况),第四个参数是可选的,表示以秒为单位的超时时间。下面是一个使用select的简单示例:import socket , selects = socket . socket () host = socket .gethostname() port = 1234 s. bind (host,port) s. listen(5) inputs = s 名师资料总结 - - -精品资料欢迎下载 - - - -
17、 - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 10 页 - - - - - - - - - while True: rs, ws, es = select . select (inputs,) for r in rs: if r is s: c, addr = s. accept () printGot connection from, addr inputs.append(c) else : try: data = r.recv (1024) disconnected = not data except socket .e
18、rror: disconnected = True if disconnected: print r. getpeername(), disconnected inputs.remove(r) else : print datapoll方法比select使用起来简单,下面的时候就是上面示例的poll版本:# - coding: utf-8 -# Windows 系统不支持 poll import socket, selects = socket.socket() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
19、- - - - - - 第 7 页,共 10 页 - - - - - - - - - host = socket.gethostname() port = 1234 s.bind(host,port) fdmap = s.fileno(): s s.listen(5) p = select .poll() p. register(s) whileTrue: events = p.poll() for fd, event inevents : if fd in fdmap: c, addr = s.accept () print Got connection from, addr p. regi
20、ster(c) fdmapc.fileno() = c elif event & select .POLLIN: data = fdmapfd.recv(1024) ifnot data:# 如果没有数据,关闭连接 print fdmapfd.getpeername(), disconnectedp.unregister(fd) del fdmapfd else : print data名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 10 页 - - - - - - -
21、- - 4. 使用 Twisted Twisted是一个事件驱动的Python 网络框架。 使用Twisted框架首先需要单独下载安装。我们可以使用pip包管理工具来进行安装,参考:http:/ 。下面是使用Twisted 的两个简单示例:4.1 使用Twisted from twisted.internet import reactor from twisted.internet.protocol import Protocol, Factory classSimpleLogger (Protocol): def connectionMade(self): printGot connecti
22、on from, self.transport.client def connectionLost (self, reason): print self.transport.client, disconnecteddef dataReceived (self, data): print data factory = Factory() factory.protocol = SimpleLogger reactor.listenTCP(8088,factory) reactor.run()使用 LineReceiver 协议改进的版本:from twisted.internet import r
23、eactor from twisted.internet.protocol import Factory from twisted.protocols.basic import LineReceiver classSimpleLogger (LineReceiver): def connectionMade(self): 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 10 页 - - - - - - - - - printGot connection from, sel
24、f.transport.client def connectionLost (self, reason): print self.transport.client, disconnecteddef lineReceived (self,line): print line factory = Factory() factory.protocol = SimpleLogger reactor.listenTCP(1234, factory) reactor.run()名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 10 页 - - - - - - - - -