socket库比较底层,但是之前在写tcp server的时候,需要多线程, 那对底层的socket进行封装,有了socketserver
base一般只是完成部分功能,并没有全部完成,基于baseserver扩展,有了TCPServer,TCP server和UDPserver有部分代码重合,TCPServer派生出一个UDPserver,
UDPserver把跟tcpserver 不一样的地方覆盖掉了
然后再衍生出其他的类,UnixStreadmServer,UnixDatagramserver
一般直接使用TCPserver和使用UDPserver
现在的TCPserver和UDPserver是同步的库,不支持多线程,不支持并发
提供了4个类,TCPserver,UDPserver,UnixStreamserver,UnixDatagramserver,是同步类
MIxin是来增强功能的,靠MIO,把mixin往前放,优先使用的属性从MIO的第一位MIXIN属性来,抢在被人前面来
Mixin是多继承来实现的,是放在继承列表的第一个
ForkingMixin 进程间的forking ,多进程方式
ThreadingMixin 多线程间的,相当于给TCP,UDPserver增加多线程能力
4个mixin出来的完全是异步的
TCPserver和UDPserver当同步来用
实现服务的话,必须使用的时候有BaseRequestHandler派生,定义一个handle()方法
这是一个基本例子
with语法支持上下文,server对于底层还是socket,socket就需要关闭资源,实际上离开调用的是socket close
现在9999端口起来了
现在创建一个client
发送quit断开了
再次链接一次
现在实现server比之前的语法简单很多(之前的需要socket,bind,listen,accept,拿到链接建立新的socket)
简化成这样就是一个server,TCPServer,监听地址和端口必须要给,MyTCPHandler(框架,把套路的东西写好了,就需要把套路里面你自己写的暴露出来)
handler要做的时候跟实例相关
在属性上绑定一个类实例化,要告诉对端client ,self(baseserver,刚才起的server本身)
这个类最后在baseserver实例化了
在这里实例化,这里的三个参数,跟上面的init有关,上面的MyTCPHandler没有init,就到基类里BaseRequestHandler
BaseRequestHandler就三个参数
也就是数据处理让你参与,其他都是它封装套路化了,数据怎么处理由handler暴露给你
其实就是TCPserver的流程写好了,暴露出来个类,让你在类里修改方法
tcp要地址和端口,还有后面的与客户端通讯,数据要如何处理,交给你写,但是有个章法
写类要遵从章法定义,学父类,该定义什么属性,该定义什么方法
看下基类约定的需要你做什么,三个参数,三个函数都没有实现,需要你自己实现,父类把套路定义好,自己去覆盖
request可以recv可以sendall,是socket对象
看一下TCPServer
第三个参数server,self是server,把自己传进去,
现在正在做handler实例化,这个self肯定不是handler
其实是有链接来,就帮你创建这个类的实例,用来跟这个链接进行处理,socket到底起几个不用管,来连接可以放到handler里面处理,handler里面存的是什么,就需要看request看,这个request是一个socket
启动一下,链接一下,先打印一下self看看
9999是自己,50217是客户端
tcpserver对象,你是handler,想知道谁在调用你,就是这个server,server里面有资源就可以到这里取,写一个socketserver就可以把handler和server链接在一起。
以后访问serve,直接self.server即可。
经常handler里写server,在server里写self.handler,方便调用
server会接收请求,把它转发给自己写的类 的handle函数,
下面request 是socket
地址,
运行一下
发一下断一下
handler完,这一趟流程就结束了,现在发送数据,服务器回复数据,就断开了,但是想要不断开,继续等消息,试试改成这样
现在只要handler不出来,相当于这次socket一直结束不了,也就是开辟了一个socket和客户端连接之后,只要你不释放掉socket,就一直可以用,等你handle返回
这个就是流程,来了一个请求,先setup,然后handle,再finish
当前的handle被修改的,一直while true,handle不返回,不抛出异常,就执行不到finally
当前建立的socket连接,可以一直使用,不断开
创建socket后,把socket传给handler实例,用完之后,该把操作断掉就断掉
用现在这个已经可以开始传输数据
改一个小例子,现在发什么响应什么回来,echoserver 回声
现在发一次收到一次
再次链接一个客户端,发送一个数据,但是没有回复
现在属于同步的
改成异步的,ThreadingTCPserver
再次链接两个客户端发送数据,现在两个都有回复消息
这是用异步多线程
下面是使用同步的
第一个可以返回的时候,第二个没回应
第一个客户端断开,第二个可以收到返回消息,
也就是前一个链接没有完成,后一个链接就链接不上去
同步的效果是,如果当前链接不退出,这个地方就需要等待
修改一下,变成for循环
输入三次就切换到下一个客户端了,说明执行三次以后,handle执行结束,调用finish,告诉外面链接,socket,close,另外一个链接上来,就调用另外的handle
另外的客户端再次发三个也断开了
同步需要等前一个结束,才轮到下一个
异步就是多线程,各跑各的并行起来,所以应该用Threading