一、简单看一下socketserver
为什么要讲socketserver?我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信。它是在socket的基础上进行了一层封装,也就是说底层还是调用的socket,在py2.7里面叫做SocketServer也就是大写了两个S,在py3里面就小写了。后面我们要写的FTP作业,需要用它来实现并发,也就是同时可以和多个客户端进行通信,多个人可以同时进行上传下载等。
那么我们先看socketserver怎么用呢,然后在分析,先看下面的代码
import socketserver #1、引入模块
class MyServer(socketserver.BaseRequestHandler): #2、自己写一个类,类名自己随便定义,然后继承socketserver这个模块里面的BaseRequestHandler这个类def handle(self): #3、写一个handle方法,必须叫这个名字#self.request #6、self.request 相当于一个connself.request.recv(1024) #7、收消息msg = '亲,学会了吗'self.request.send(bytes(msg,encoding='utf-8')) #8、发消息self.request.close() #9、关闭连接# 拿到了我们对每个客户端的管道,那么我们自己在这个方法里面的就写我们接收消息发送消息的逻辑就可以了pass
if __name__ == '__mian__':#thread 线程,现在只需要简单理解线程,别着急,后面很快就会讲到啦,看下面的图server = socketserver.ThreadingTCPServer(('127.0.0.1',8090),MyServer)#4、使用socketserver的ThreadingTCPServer这个类,将IP和端口的元祖传进去,还需要将上面咱们自己定义的类传进去,得到一个对象,相当于我们通过它进行了bind、listenserver.serve_forever() #5、使用我们上面这个类的对象来执行serve_forever()方法,他的作用就是说,我的服务一直开启着,就像京东一样,不能关闭网站,对吧,并且serve_forever()帮我们进行了accept#注意:
#有socketserver 那么有socketclient的吗?
#当然不会有,我要作为客户去访问京东的时候,京东帮我也客户端了吗,客户端是不是在我们自己的电脑啊,并且socketserver对客户端没有太高的要求,只需要自己写一些socket就行了。
二 类之间关系
基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环
socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题)
1 server类:
- 它有4个同步类:
- TCPServer
- UDPServer
- UnixStreamServer
- UnixDatagramServer
- 两个Mixin类,用来支持异步。
- ForkingMixIn
- ThreadingMixIn
2 request类:
3 继承关系:
组合得到
class ForkingUDPServer(ForkingMixIn,UDPServer):pass
class ForkingTCPServer(ForkingMixIn,TCPServer):pass
class ThreadingUDPServer(ThreadingMixIn,UDPServer):pass
class ThreadingTCPServer(ThreadingMixIn,TCPServer):pass