23. Python脚本学习笔记二十三网络编程
来源:互联网 发布:fl软件下载 编辑:程序博客网 时间:2024/05/16 00:27
23. Python脚本学习笔记二十三网络编程
本篇名言:“相处时需要包容,相恋时需要真心,争吵时沟通,孤独时需要人陪,难过时需要安慰,生气时需要冷静,快乐时需要分享。”
Python是一个很强大的网络编程工具,因为其内有很多常见网络协议的库,在库顶部可以获得抽象层。让我们可以集中精力在程序的逻辑处理上,而不是停留在网络实现的细节中。
1. 网络设计模块
1.1 Socket模块
网络编程中的一个基本组件就是套接字(socket).套接字包括两个:服务器套接字和客户机套接字。
一个套接字就是一个socket模块中的socket类的实例。实例化需要3个参数,第一个参数是地址族,第二个参数是流或数据报套接字,第三个参数是使用的协议。服务器套接字使用bind方法后,再调用listen方法去监听这个给定的地址。客户端套接字使用connect方法连接到服务器。
套接字有两个方法:send和recv。
看个实例:
服务器端:
import socket
s =socket.socket()
host =socket.gethostname()
port = 1234
s.bind((host,port))
s.listen(5)
while True:
c, addr = s.accept()
print 'Got connection from', addr
c.send('Thank you for connecting')
c.close()
客户机端:
importsocket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.connect((host, port))
print s.recv(1024)
1.2 urllib和urllib2模块
在能使用的各种网络工作库中,功能最强大的是urllib和urllib2。这个模块能通过网络访问文件。两个模块差不读哦,不过urllib2更好一些。
通过如下2行代码,
from urllib import urlopen
webpage=urlopen('http://www.python.org')
可以获得网页的类文件对象。
使用如下代码
from urllib import urlopen, urlretrieve
urlretrieve('http://www.python.org','python_webpage.html')
将Pytohn主页保存到python_webapage.html文件中。
2. SocketServer
SocketServer模块是标准库中很多服务器框架的基础,这些服务器框架包括BaseHTTPServer,SimpleHTTPServer,CGIHTTPServer, SimpleXMLRPCServer和 DocXMLRPCServer等。
2.1 通过SocketServer框架
通过SocketServer来实现刚才的Socket,如下:
fromSocketServerimport TCPServer,StreamRequestHandler
classHandler(StreamRequestHandler):
defhandle(self):
addr = self.request.getpeername()
print'Got connection from', addr
self.wfile.write('Thank you for connecting')
server = TCPServer(('',1234), Handler)
server.serve_forever()
这里多了一个请求处理程序Handler,每当客户端有一个请求时,就会实例化一个请求处理程序,并且各种处理方法会在处理请求时被调用。
3. 多连接
之前我们描述的都是一次连接一个客户机并处理请求。如何实现同时处理多个连接呢?
可以采用3种主要的方法:分叉(forking),线程(threading)以及异步IO(asynchronous I/O)。不过有几个缺点:1、分叉占据资源,2、线程处理能导致同步问题。
异步IO可以使用select函数来实现,在UNIX下也可以使用poll函数,poll函数的伸缩性更好,不过只能在UNIX系统中使用。
Select函数实现服务端如下:
import socket, select
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))
s.listen(5)
inputs = [s]
while True:
rs,ws, es = select.select(inputs, [], [])
for rin rs:
ifr is s:
c, addr = s.accept()
print 'Got connection from', addr
inputs.append(c)
else:
try:
data = r.recv(1024)
disconnected = not data
except socket.error:
disconnected = True
if disconnected:
print r.getpeername(), 'disconnected'
inputs.remove(r)
else:
print data
4. Twisted
Twisted是一个事件驱动的Python网络框架,原来是为网络游戏开发的,现在被所有类型的网络软件使用了。
4.1 下载
https://twistedmatrix.com/trac/
从这个连接中进行下载并安装,即可。
再下载 zope.interface
https://pypi.python.org/pypi/zope.interface#downloads
将zope.interface-3.8.0-py2.7-win32.egg放到 C:\Python27\Scripts目录下。
在命令行中运行:
C:\>cd Python27\Scripts
C:\Python27\Scripts>easy_install.exe zope.interface-3.8.0-py2.7-win32.egg
4.2 编写Twisted服务器
在SocketServer的服务器有一个隐式的循环,在循环中服务器查找连接并为每个连接创建一个处理程序。
使用Twisted的简单服务器如下:
fromtwisted.internetimportreactor
fromtwisted.internet.protocolimportProtocol, Factory
classSimpleLogger(Protocol):
defconnectionMade(self):
print'Got connection from',self.transport.client
defconnectionLost(self,reason):
printself.transport.client, 'disconnected'
defdataReceived(self,data):
print data
factory = Factory()
factory.protocol = SimpleLogger
reactor.listenTCP(1234, factory)
reactor.run()
执行两个客户端并终端后输出如下:
Gotconnection from ('192.168.1.3', 51942)
Gotconnection from ('192.168.1.3', 51961)
('192.168.1.3',51961) disconnected
('192.168.1.3',51942) disconnected
这里必须实例化factory,还要设置它的protocol属性,这样在和客户机通信时就知道使用什么协议。然后在给定的端口处使用工厂进行监听,这个工厂要通过实例化协议对象来准备处理连接。使用reactor中的listenTCP函数来监听,最后调用模块中的run函数启动服务器。
- 23. Python脚本学习笔记二十三网络编程
- python网络编程学习笔记(二)
- python 学习笔记(二十三)
- Java笔记二十三.网络编程基础与UDP编程
- 13. Python脚本学习笔记十三类与对象
- python网络编程学习笔记
- python+opencv学习笔记(二)python的脚本式编程
- 《Python 编程》笔记(十三)
- selenium+python:脚本学习笔记(二)
- python学习(二十三)
- Allegro学习笔记二十三
- 学习笔记(二十三)
- python 学习笔记(十三)
- Python学习笔记(十三)
- 25. Python脚本学习笔记二十五 CGI脚本
- 《ASP网络编程》学习笔记之二
- 《UNIX网络编程 》学习笔记 (二)
- 黑马程序员-学习笔记/网络编程二
- ajax,json学习笔记(五)总结
- UVA
- 22. Python脚本学习笔记二十二数据库支持
- 相机聚焦,相机截屏
- 机器学习十大算法原理总结
- 23. Python脚本学习笔记二十三网络编程
- 6.10 水仙花数
- 24. Python脚本学习笔记二十四屏幕抓取
- 华为热备份路由协议 vrrp 双主双备
- 安装imageio
- Cypress-USB-PnP事件注册方法
- 清空cmake的输出
- hibernate annotation注解方式来处理映射关系
- jqgraid table 表头与内容cell无法对齐 解决方案