收藏 分享(赏)

Python网络编程.doc

上传人:精品资料 文档编号:9447614 上传时间:2019-08-08 格式:DOC 页数:10 大小:29.21KB
下载 相关 举报
Python网络编程.doc_第1页
第1页 / 共10页
Python网络编程.doc_第2页
第2页 / 共10页
Python网络编程.doc_第3页
第3页 / 共10页
Python网络编程.doc_第4页
第4页 / 共10页
Python网络编程.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、Python 网络编程Python 内置封装了很多常见的网络协议的库,因此 Python 成为了一个强大的网络编程工具,这里是对 Python 的网络方面编程的一个简单描述。1. 常用的网络设计模块在标准库中有很多网络设计相关的模块,除了那些明确处理网络事务的模块外,还有很多模块也是是和网络相关的,下面是几个常用的网络设计模块:1.1 socket 模块socket 模块是网络编程中的基础组件。socket 主要的作用就是作为两个程序之间的“通信信道” ,不同进程(不同主机)可以通过 socket 相互发送信息,以达到网络通信的目的。socket 包括两个部分:服务端和客户端。服务端监听端口号

2、,等待客户端发送的消息;而客户端在需要发送信息是,连接服务端,将信息发送出去即可。下面是一个简单的同步网络编程的简单示例:#这是 Socket Server 部分:import sockets = socket.socket()host = socket.gethostname()port = 8088s.bind(host,port)s.listen(5)while True:c, addr = s.accept()print Got connection from, addrc.send(Thank you for connection)c.close()#这是 Socket Client

3、 部分:import sockets = socket.socket()host = socket.gethostname()port = 8088s.connect(host,port)print s.recv(1024)运行时,请将对应的端口(这里是 8088)添加到防火墙的 InBound 和 OutBound 的规则中。1.2 urllib 和 urllib2 模块urllib 和 urllib2 是 Python 标准库中最强的的网络工作库。通过这两个库所提供的上层接口,使我们可以像读取本地文件一样读取网络上的文件。而且 urllib2 并不是urllib 的升级版本(应该是一种补充

4、),二者是不可相互替代的。通过使用 urllib 的 urlopen 函数可以很容易的打开远程的文件,如下:from urllib import urlopenwebpage = urlopen(http:/ = webpage.readline(45)print txt # !DOCTYPE html PUBLIC “-/W3C/DTD XHTML 1.0 也可以通过在通过在路径的前面添加 file: 来访问本地文件:from urllib import urlopenwebpage = urlopen(rfile:D:Hsr23updADD_ABBR.txt)txt = webpage.r

5、eadline(45)print txt 如果你还可以通过 urllib 提供的 urlretrieve 函数,来直接保存远程文件副本:from urllib import urlretrievewebpage = urlretrieve(http:/ type(webpage) # 1.3 其他与网络相关的模块除了 socket、urllib 和 urllib2 这些模块以外标准库还有很多和网络相关的模块,下面的列表是其中的一部分:=模块 描述=asynchat asyncore 的增强版本 asyncore 异步 socket 处理程序 cgi 基本的 CGI 支持 Cookie Cook

6、ie 对象操作,主要用于服务器操作 cookielib 客户端 cookie 支持 email E-mail 消息支持(包括 MIME) ftplib FTP 客户端模块 gopherlib gopher 客户端博客 httplib HTTP 客户端模块 imaplib IMAP4 客户端模块 mailbox 读取几种邮件的格式 mailcap 通过 mailcap 文件访问 MIME 配置 mhlib 访问 MH 邮箱 nntplib NNTP 客户端模块 poplib POP 客户端模块 robotparser 支持解析 Web 服务器的 robot 文件 SimpleXMLRPCServ

7、er 一个简单的 XML-RPC 服务器 stmpd SMTP 服务器模块 smtplib SMTP 客户端模块 telnetlib Telnet 客户端模块 urlparse 支持解析 URL xmlrpclib XML-RPC 的客户端支持 2. SocketServerSocketServer 模块是标准库中很多其他服务器框架的基础,这些服务器框架包括:BaseHTTPServer、SimpleHTTPServer、CGIHTTPServer 、SimpleXMLRPCServer和 DocXMLRPCServer,这些服务框架都是在基础框架上增加了特定的功能。SocketServer

8、包含了 4 个基本的类: TCPServer,针对 TCP 的 Socket UDPServer,针对 UDP 数据报的 Socket UnixStreamServer UnixDatagramServer下面是一个基于 SocketServer 的简单 Socket Server 端示例:from SocketServer import TCPServer, StreamRequestHandlerclass Handler(StreamRequestHandler):def handle(self):addr = self.request.getpeername()self.wfile.w

9、rite(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 使用分叉分叉(fork)是一个 UNIX 术语;当分叉一个进程(一个运行的程序)时,基本上时复制了它,并且分叉后的两个进

10、程都从当前执行的点继续运行,并且每个进程都有自己的内存副本。一个进程(开始的那个)成为另一个进程的(复制的,也就是子进程)的父进程。在一个使用分叉的服务器中,每个客户端连接都利用分叉创建一个子进程。父进程继续监听连接,同时子进程处理客户端。当客户端的请求结束时,子进程退出。分叉的进程是并行执行的,客户端直接不必相互等待。分叉的缺点是比较耗费资源(每个分叉出来的进程都需要自己的内存)。下面是一个使用分叉创建 Socket 服务端的示例:# -coding:utf-8-# 使用了分叉(fork),Windows 系统不支持from SocketServer import TCPServer, Fo

11、rkingMixIn, StreamRequestHandlerclass Server(ForkingMixIn, TCPServer):passclass Handler(StreamRequestHandler):def handle(self):addr = self.request.getpeername()print Got connection from, addrself.wfile.write(Thank you for connectiong)server = Server(,1234),Handler)server.serve_forever()3.2 使用线程线程是轻量

12、级的进程或子进程,所有的线程都存在于相同的进程(一个运行的程序)中,且共享内存。虽然使用多线程相对于分叉占用的资源较少,但是由于共享内存,所有必需要确保它们的变量不会冲突,或者是同一时间修改同一内容,这样会造成混乱。这些问题可以归结为同步问题。下面是使用多线程的一个简单示例:# -coding:utf-8-# 使用多线程from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandlerclass Server(ThreadingMixIn,TCPServer):passclass Handler(StreamRequ

13、estHandler):def handle(self):addr = self.request.getpeername()print Got connection from, addrself.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 模块对它们进行了进一步的包装

14、,可以从更高层次来处理异步I/O。poll 函数和 select 函数一样,也属于 select 模块,这两个函数的功能基本一样,相对而言 poll 的伸缩性更好,但其职能在 UNIX 系统使用使用。select 函数需要 3 个序列作为它的必选参数(输入、输出、异常情况),第四个参数是可选的,表示以秒为单位的超时时间。下面是一个使用 select 的简单示例:import socket, selects = socket.socket()host = socket.gethostname()port = 1234s.bind(host,port)s.listen(5)inputs = swh

15、ile True:rs, ws, es = select.select(inputs,)for r in rs:if r is s:c, addr = s.accept()print Got connection from, addrinputs.append(c)else:try:data = r.recv(1024)disconnected = not dataexcept socket.error:disconnected = Trueif disconnected:print r.getpeername(), disconnectedinputs.remove(r)else:print

16、 datapoll 方法比 select 使用起来简单,下面的时候就是上面示例的 poll 版本:# - coding: utf-8 -# Windows 系统不支持 pollimport socket, selects = socket.socket()host = socket.gethostname()port = 1234s.bind(host,port)fdmap = s.fileno(): ss.listen(5)p = select.poll()p.register(s)while True:events = p.poll()for fd, event in events:if

17、fd in fdmap:c, addr = s.accept()print Got connection from, addrp.register(c)fdmapc.fileno() = celif event & select.POLLIN:data = fdmapfd.recv(1024)if not data:# 如果没有数据,关闭连接print fdmapfd.getpeername(), disconnectedp.unregister(fd)del fdmapfdelse:print data4. 使用 TwistedTwisted 是一个事件驱动的 Python 网络框架。使用

18、Twisted 框架首先需要单独下载安装。我们可以使用 pip 包管理工具来进行安装,参考:http:/ Twisted 的两个简单示例:4.1 使用 Twistedfrom twisted.internet import reactorfrom twisted.internet.protocol import Protocol, Factoryclass SimpleLogger(Protocol):def connectionMade(self):print Got connection from, self.transport.clientdef connectionLost(self,

19、 reason):print self.transport.client, disconnecteddef dataReceived(self, data):print datafactory = Factory()factory.protocol = SimpleLoggerreactor.listenTCP(8088,factory)reactor.run()使用 LineReceiver 协议改进的版本:from twisted.internet import reactorfrom twisted.internet.protocol import Factoryfrom twisted

20、.protocols.basic import LineReceiverclass SimpleLogger(LineReceiver):def connectionMade(self):print Got connection from, self.transport.clientdef connectionLost(self, reason):print self.transport.client, disconnecteddef lineReceived(self,line):print linefactory = Factory()factory.protocol = SimpleLoggerreactor.listenTCP(1234, factory)reactor.run()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报