Python网络编程.docx
- 文档编号:23579550
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:8
- 大小:17.15KB
Python网络编程.docx
《Python网络编程.docx》由会员分享,可在线阅读,更多相关《Python网络编程.docx(8页珍藏版)》请在冰豆网上搜索。
Python网络编程
Python网络编程
Python内置封装了很多常见的网络协议的库,因此Python成为了一个强大的网络编程工具,这里是对Python的网络方面编程的一个简单描述。
1.常用的网络设计模块
在标准库中有很多网络设计相关的模块,除了那些明确处理网络事务的模块外,还有很多模块也是是和网络相关的,下面是几个常用的网络设计模块:
socket模块
socket?
模块是网络编程中的基础组件。
socket主要的作用就是作为两个程序之间的“通信信道”,不同进程(不同主机)可以通过socket相互发送信息,以达到网络通信的目的。
socket包括两个部分:
服务端和客户端。
服务端监听端口号,等待客户端发送的消息;而客户端在需要发送信息是,连接服务端,将信息发送出去即可。
下面是一个简单的同步网络编程的简单示例:
#这是SocketServer部分:
importsocket
s=()
host=()
port=8088
((host,port))
(5)
whileTrue:
c,addr=()
print'Gotconnectionfrom',addr
('Thankyouforconnection')
()
#这是SocketClient部分:
importsocket
s=()
host=()
port=8088
((host,port))
print(1024)
运行时,请将对应的端口(这里是8088)添加到防火墙的InBound和OutBound的规则中。
urllib和urllib2模块
urllib?
和?
urllib2?
是Python标准库中最强的的网络工作库。
通过这两个库所提供的上层接口,使我们可以像读取本地文件一样读取网络上的文件。
而且?
urllib2?
并不是?
urllib?
的升级版本(应该是一种补充),二者是不可相互替代的。
通过使用?
urllib?
的?
urlopen?
函数可以很容易的打开远程的文件,如下:
fromurllibimporturlopen
webpage=urlopen('')
txt=(45)
printtxt#!
DOCTYPEhtmlPUBLIC"-SocketServer
SocketServer模块是标准库中很多其他服务器框架的基础,这些服务器框架包括:
BaseHTTPServer、SimpleHTTPServer、CGIHTTPServer、SimpleXMLRPCServer和DocXMLRPCServer,这些服务框架都是在基础框架上增加了特定的功能。
SocketServer包含了4个基本的类:
TCPServer,针对TCP的Socket
UDPServer,针对UDP数据报的Socket
UnixStreamServer
UnixDatagramServer
下面是一个基于SocketServer的简单SocketServer端示例:
fromSocketServerimportTCPServer,StreamRequestHandler
classHandler(StreamRequestHandler):
defhandle(self):
addr='Thankyouforconnectiong')
server=TCPServer(('',8088),Handler)
()
3.多连接
一般情况下Socket中的Client端常常不止一个,想要使SocketServer端能同时处理多个Client的连接一般由三种主要的方法:
分叉(forking)(windows不支持)
线程(threading)
异步I/O(asynchronousI/O)
使用分叉
分叉(fork)是一个UNIX术语;当分叉一个进程(一个运行的程序)时,基本上时复制了它,并且分叉后的两个进程都从当前执行的点继续运行,并且每个进程都有自己的内存副本。
一个进程(开始的那个)成为另一个进程的(复制的,也就是子进程)的父进程。
在一个使用分叉的服务器中,每个客户端连接都利用分叉创建一个子进程。
父进程继续监听连接,同时子进程处理客户端。
当客户端的请求结束时,子进程退出。
分叉的进程是并行执行的,客户端直接不必相互等待。
分叉的缺点是比较耗费资源(每个分叉出来的进程都需要自己的内存)。
下面是一个使用分叉创建Socket服务端的示例:
#--coding:
utf-8--
#使用了分叉(fork),Windows系统不支持
fromSocketServerimportTCPServer,ForkingMixIn,StreamRequestHandler
classServer(ForkingMixIn,TCPServer):
pass
classHandler(StreamRequestHandler):
defhandle(self):
addr=print'Gotconnectionfrom',addr
'Thankyouforconnectiong')
server=Server(('',1234),Handler)
()
使用线程
线程是轻量级的进程或子进程,所有的线程都存在于相同的进程(一个运行的程序)中,且共享内存。
虽然使用多线程相对于分叉占用的资源较少,但是由于共享内存,所有必需要确保它们的变量不会冲突,或者是同一时间修改同一内容,这样会造成混乱。
这些问题可以归结为同步问题。
下面是使用多线程的一个简单示例:
#--coding:
utf-8--
#使用多线程
fromSocketServerimportTCPServer,ThreadingMixIn,StreamRequestHandler
classServer(ThreadingMixIn,TCPServer):
pass
classHandler(StreamRequestHandler):
defhandle(self):
addr=print'Gotconnectionfrom',addr
'Thankyouforconnection')
server=Server(('',1234),Handler)
()
带有select和poll的异步I/O
在Python中的异步I/O的基础就是?
select?
模块的?
select?
函数。
标准库中的?
asyncore?
和?
asynchat?
模块对它们进行了进一步的包装,可以从更高层次来处理异步I/O。
poll?
函数和?
select?
函数一样,也属于?
select?
模块,这两个函数的功能基本一样,相对而言?
poll?
的伸缩性更好,但其职能在UNIX系统使用使用。
select?
函数需要3个序列作为它的必选参数(输入、输出、异常情况),第四个参数是可选的,表示以秒为单位的超时时间。
下面是一个使用?
select?
的简单示例:
importsocket,select
s=()
host=()
port=1234
((host,port))
(5)
inputs=[s]
whileTrue:
rs,ws,es=(inputs,[],[])
forrinrs:
ifriss:
c,addr=()
print'Gotconnectionfrom',addr
(c)
else:
try:
data=(1024)
disconnected=notdata
except:
disconnected=True
ifdisconnected:
print(),'disconnected'
(r)
else:
printdata
poll?
方法比?
select?
使用起来简单,下面的时候就是上面示例的?
poll?
版本:
#--coding:
utf-8--
#Windows系统不支持poll
importsocket,select
s=()
host=()
port=1234
((host,port))
fdmap={():
s}
(5)
p=()
(s)
whileTrue:
events=()
forfd,eventinevents:
iffdinfdmap:
c,addr=()
print'Gotconnectionfrom',addr
(c)
fdmap[()]=c
elifevent&:
data=fdmap[fd].recv(1024)
ifnotdata:
#如果没有数据,关闭连接
printfdmap[fd].getpeername(),'disconnected'
(fd)
delfdmap[fd]
else:
printdata
4.使用Twisted
Twisted?
是一个事件驱动的Python网络框架。
使用?
Twisted?
框架首先需要单独下载安装。
我们可以使用pip包管理工具来进行安装,参考:
。
下面是使用Twisted的两个简单示例:
使用Twisted
fromimportreactor
fromimportProtocol,Factory
classSimpleLogger(Protocol):
defconnectionMade(self):
print'Gotconnectionfrom',defconnectionLost(self,reason):
print'disconnected'
defdataReceived(self,data):
printdata
factory=Factory()
=SimpleLogger
(8088,factory)
()
使用LineReceiver协议改进的版本:
fromimportreactor
fromimportFactory
fromimportLineReceiver
classSimpleLogger(LineReceiver):
defconnectionMade(self):
print'Gotconnectionfrom',defconnectionLost(self,reason):
print'disconnected'
deflineReceived(self,line):
printline
factory=Factory()
=SimpleLogger
(1234,factory)
()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python 网络 编程