Python网络编程.docx

上传人:b****0 文档编号:9367718 上传时间:2023-05-18 格式:DOCX 页数:8 大小:17.15KB
下载 相关 举报
Python网络编程.docx_第1页
第1页 / 共8页
Python网络编程.docx_第2页
第2页 / 共8页
Python网络编程.docx_第3页
第3页 / 共8页
Python网络编程.docx_第4页
第4页 / 共8页
Python网络编程.docx_第5页
第5页 / 共8页
Python网络编程.docx_第6页
第6页 / 共8页
Python网络编程.docx_第7页
第7页 / 共8页
Python网络编程.docx_第8页
第8页 / 共8页
亲,该文档总共8页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Python网络编程.docx

《Python网络编程.docx》由会员分享,可在线阅读,更多相关《Python网络编程.docx(8页珍藏版)》请在冰点文库上搜索。

Python网络编程.docx

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)

()

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2