Day10 - Python基础10 socketserver 实现并发
本节内容:
1.实例tcp的并发
2.看源代码继承关系
3.详解:ThreadingTCPServer的过程
4.tcp和udp的request 不同
5.基于udp的并发实现
1.实例tcp并发
server
client
创建服务器的步骤:
1:首先必须创建一个请求处理类
2:它是BaseRequestHandler的子类
3:该请求处理类是BaseRequestHandler的子类并重新写其handle()方法
实例化 请求处理类传入服务器地址和请求处理程序类
最后实例化调用serve_forever() #无限处理client请求
2.看源代码继承关系

知识点1:并发我们可以选择 线程方式,或者并发的方式:
if __name__ == '__main__':
# s = socketserver.ThreadingTCPServer(('127.0.0.1',8991),Myserver)
s = socketserver.ForkingTCPServer(('127.0.0.1',8991),Myserver) ##可以对上点的代码采用进程的方式并发,但是注意的是windows可能会出错
s.serve_forever() ##可以选择把 server 放在linux上面跑
3.详解:ThreadingTCPServer的过程

上述代码的内部调用流程为:
启动服务端程序
执行 TCPServer.__init__ 方法,创建服务端Socket对象并绑定 IP 和 端口
执行 BaseServer.__init__ 方法,将自定义的继承自SocketServer.BaseRequestHandler 的类 Myserver赋值给 self.RequestHandlerClass
执行 BaseServer.server_forever 方法,While 循环一直监听是否有客户端请求到达 ...
当客户端连接到达服务器
执行 ThreadingMixIn.process_request 方法,创建一个 “线程” 用来处理请求
执行 ThreadingMixIn.process_request_thread 方法
执行 BaseServer.finish_request 方法,执行 self.RequestHandlerClass() 即:执行 自定义 MyRequestHandler 的构造方法(自动调用基类BaseRequestHandler的构造方法,在该构造方法中又会调用 Myserver的handle方法)
4.tcp和udp的request 不同
tcp:

udp:

5:基于udp的并发实现
#########server#######################
import socketserver class Myserver(socketserver.BaseRequestHandler):
def handle(self):
# while 1 :
print(self.request[1]) ##<socket.socket fd=184, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8991)>
print(self.request[0]) ##b'2'
print(self.client_address) ##('127.0.0.1', 63617) if __name__ == '__main__':
s = socketserver.ThreadingUDPServer(('127.0.0.1',8991),Myserver) ##socket bind listen 实例
# s = socketserver.ForkingTCPServer(('127.0.0.1',8991),Myserver) ##socket bind listen 实例
s.serve_forever() ##########client############## import socket ip_port = ('127.0.0.1' ,8991)
buff_size = 1024
s_sk = socket.socket(socket.AF_INET ,socket.SOCK_STREAM) s_sk.connect(ip_port) while 1 :
data = input('PLZ YOUR DATA:').strip()
if not data :continue
s_sk.sendall(data.encode('utf-8'))
data = s_sk.recv(buff_size)
print('接收客户端返回的数据:',data.decode('utf-8'))
Day10 - Python基础10 socketserver 实现并发的更多相关文章
- 十. Python基础(10)--装饰器
十. Python基础(10)--装饰器 1 ● 装饰器 A decorator is a function that take a function as an argument and retur ...
- 『Python基础-10』字典
# 『Python基础-10』字典 目录: 1.字典基本概念 2.字典键(key)的特性 3.字典的创建 4-7.字典的增删改查 8.遍历字典 1. 字典的基本概念 字典一种key - value 的 ...
- python 基础 10.0 nosql 简介--redis 连接池及管道
一. NOSQL 数据库简介 NoSQL 泛指非关系型的数据库.非关系型数据库与关系型数据库的差别 非关系型数据库的优势: 1.性能NOSQL 是基于键值对的,可以想象成表中的主键和值的对应关系,而且 ...
- Python基础10 反过头来看看
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 从最初的"Hello World",走到面向对象.该回过头来看 ...
- python基础(10)-匿名函数&内置函数
匿名函数 例子 返回两个数的和 def add(x, y): return x + y # 等价于 add = lambda x, y: x + y 返回字典中值最大的key dic = {'a': ...
- Python之利用socketserver实现并发
socketserver这个模块是利用IO多路复用以及多线程实现并发的,可以让服务器同时建立多个链接 原理如图 我们这样更改服务器代码 import socketserver '''需要先写上一个类继 ...
- python基础——10(三元运算符、匿名函数)
一.三元运算符 本质是if--else--的语法糖 前提:简化if--else--的结构,且两个分支有且只有一条语句 案例: a = 20 b = 30 res = a if a > b els ...
- Python基础10 回顾
从最初的"Hello World",走到面向对象,该回过头来看看,教程中是否遗漏了什么. 我们之前提到一句话,"Everything is Object".那么 ...
- 『无为则无心』Python基础 — 10、Python字符串的格式化输出
目录 1.什么是格式化输出 2.Python格式化输出的五种方式 方式一:字符串之间用+号拼接 方式二:print()函数可同时输出多个字符串 方式三:占位符方式 方式四:f格式化方式(推荐) 方式五 ...
随机推荐
- Java 读取excel表格文件
注意,本文使用的Jar包为jxl.jar,只能处理97-03版本xls格式的Excel jar包 maven依赖: <dependency> <groupId>net.sour ...
- ABAP里SELECT的用法汇总(转)
通常使用Open SQL的数据查询语句SELECT将数据库条目选择到内存.一.SELECT语句:1)SELECT用于确定读取数据表中的哪些字段:2)FROM子句用于确定从哪些内表或者视图中读取数据:3 ...
- WPF 3D Cube及点击交互
在WPF中构建一个简单的立方体比较容易实现,可参考资料也比较众多.比较麻烦的是处理点击交互. 我在WPF中用两种方式实现了3DCube,效果图如下: 方式一: 最常见的3D内容构建模式,结构如下图. ...
- 5.java基础之static、类加载过程
static修饰符 修饰属性:静态的属性不属于任何对象,全类及其对象共用,可以用类名直接调用 修饰方法:静态的方法可以直接用类名调用,和对象无关.静态方法只能访问静态成员和静态方法,非静态方法可以调用 ...
- JqueryOn绑定事件方法介绍
JqueryOn绑定事件方法介绍 1. 简介 (1) On()方法在被选及子元素上添加一个或多个事件处理程序 (2) 在jquery 版本1.7起,on()方法是bind(),live()和deleg ...
- 如何正确使用 Spring Cloud?【下】
5. Spring Cloud 如何融合 DevOps? 接下来,我们来了解一下 Spring Cloud 在与 DevOps 融合方面可以做哪些事情,它是如何让应用持续交付更加快捷的?我们都知道,D ...
- SpringCloud面试 -- 什么是Hystrix?
Hystrix是什么? 在分布式系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务,有的时候某些依赖服务出现故障也是很常见的. Hystrix 可以让我们在分 ...
- QT程序自启动
故事背景:最近涉及到客户端更新自启动的一个问题,客户端检测到自己要更新,弹出一个更新界面,然后退出旧版本,启动新版本 技术调研:QProcess 直接上代码吧 qApp->quit(); QPr ...
- windows命令行pip报错解决的方法
今天在新电脑安装python,发现pip无效了,于是乎百度了很多方法,发现原因是pip升级导致的 解决办法,卸载pip重新安装 可以首先执行 python -m ensurepip 然后执行 py ...
- nmcli详解
1. nmcli 安装 [root@liujunjun ~]# yum install -y NetworkManager CentOS7默认已安装了 2. nmcli 基本选项 选项 作用 -t 简 ...