2020/01/15 03-socketserver模块

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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值