python基础教程学习笔记十四

网络编程

1 几个网络设计模块

Socket模块

套接字实例化需要的三个参数:

socket.socket(family=AF_INET,#地址族

type=SOCK_STREAM,#流或数据报

proto=0,#使用的协议

fileno=None)

使用以下两个方法进行数据传输:send和recv

一个小型服务器 使用bind方法 和linsten方法

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 connect from',addr)

c.sendall(b'Thank you for connecting')

c.close()

一个小型客户机 使用connect方法联接

import socket

s=socket.socket()

host=socket.gethostname()

port=1234

s.connect((host,port))

print('服务器返回信息',s.recv(1024))

Urlliburllib2模块 通过网络访问文件

Utllib简单的文件下载

Urllib2可以实现http验证cookie或为自已的协议写扩展程序

#打开远程文件

From utllib import urlopen

Webpage=urlopen(‘http://www.python.org’)

#返回的文件支持close() read() readline() readlines()

#获取远程文件

Urlretrieve(‘http://ww.python.org’)

2 socketServer

服务器框架

baseHTTPServer

SimpleHTTPServer

CGIHTTPServer

SimpleXMLRPCServer

DocXMLRPCServer

SocketServer有四个基本的类

tcpServer

udpServer

unixStreamServer

unixDatagramServer

请求处理程序requestHandler,通过handle方法来处理,self.request取得客户端套接字,

如果使用的是流,可以使用streamRequestHandler,其中self.rfile用于读取,self.wfile用于写入

一个基于socketServer的小型服务器

//python3SocketServer改为 socketserver

from socketserver import TCPServer,StreamRequestHandler

class Handler(StreamRequestHandler):

def handler(self):

addr=self.request.getpeername()

print('got connection from',addr)

self.wfile.write('Thank you for connecting')

server=TCPServer(('',1234),Handler)

server.serve_forever()

3 并发多链接

实现并发的三种方法:

Forking 分叉 windows不支持

Threading 线程

异步io asynchronous IO select模块的select函数

twisited

使用socketserver进行分叉和线程处理

#使用了分叉枝术的服务器

from socketserver import TCPServer,ForkingMixIn,StreamRequestHandler

class Server(ForkingMixIn,TCPServer):pass

class Handler(StreamRequestHandler):

def handle(self):

addr=self.request.getpeername()

print('got connection form',addr)

self.wfile.write('Thank you for connection')

server=Server(('',1234),Handler)

server.serve_forever()

#使用了线程处理的服务器

from socketserver import TCPServer,ThreadingMixIn,StreamRequestHandler

class Server(ThreadingMixIn,TCPServer):pass

class Handler(StreamRequestHandler):

def handler(self):

addr=self.request.getpeername()

print('Got connection from',addr)

self.wfile.write('Thank you for connecting')

server=Server(('',1234),Handler)

server.serve_forever()

带有select poll的异步io

#使用select的简单服务器

import socket,select

s=socket.socket()

host=socket.gethostname()

port=1234

s.bind((host,port))

s.listen(s)

inputs=[s]

while True:

rs,ws,es=select.select(inputs,[],[])

for r in rs:

if r is s:

e,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)

#使用pull的简单服务器

import socket,select

s=socket.socket()

host=socket.gethostname()

port=1234

s.bind((host,port))

fdmap=(s.fileno():s)

s.listen(5)

p=select.poll()

p.register(s)

while True:

events=p.poll()

for fd.event in events:

if fd in fdmap:

c,addr=s.accept()

print('Got connection from',addr)

p.register(c)

fdmap(c.fileno())=c

elif event $ select.POLLIN:

data=fdmap[fd].recv(1024)

if not data:#没有数据关闭连接

print(fdmap[fd].getpeername,'disconnected')

p.unregister(fd)

del fdmap[fd]

else:

print(data)

Twisted

是一个事件驱动的python网络框架

#使用twisted的简单服务器

from twisted.internet import reactor

form twisted.internet import Protocol,Factory

class SimpleLogger(Protocol):

def connectionMade(self):

print('Got connection from',self.transport.client)

def connectionLost(self,reason):

print(self.transport.client,'disconnected')

def dataReceived(self,data):

print(data)

factory=Factory()

factory.protocol=SimpleLogger

reactor.listenTCP(1234,factory)

reactor.run()

#一个使用lineReceiver协议改进的记录服务器

from twisted.internet import reactor

from twisted.internet.protocol import Factory

from twisted.protocols.basic import LineReceiver

class SimpleLogger(LineReceiver):

def connectionMade(self):

print('Got connection from',self.transport.client)

def connectionLost(self):

print(self.transport.client,'disconnected')

def lineReceived(self.line):

print(line)

factory=Factory()

factory.protocol=SimpleLogger

reactor.listenTCP(1234,factory)

teactor.run()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值