Python基础-socketserver
ocketserver通讯模块实现并发操作,基于select、epoll、socket、多线程,实现的正真多线程多并发
socketserver通讯模块底层调用的socket模块,只是它作了处理基于lo多路复用加多线程,能实现并发操作,1
SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端。即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求。
通讯模块实现并发操作服务端,2
1,import socketserver #导入模块,3
2,必须创建一个类来,继承两个类socketserver和BaseRequestHandler,注意必须创建一个类来继承这两个模块内部指定的类4
socketserver,创建类模块指定继承类名称5
BaseRequestHandler,创建类模块指定继承类名称6
注意:这个类对象里自动封装了3个普通字段分别为,self.request(客户端连接对象),self.client_address(客户端IP和端口),self.server(服务端对象)7
self.request(客户端连接对象)8
self.client_address(客户端IP和端口)9
self.server(服务端对象)10
3,创建的类里必须创建一个handle()方法,当客户端连接后就会执行这个handle()方法,所以各种发送数据和接收数据都是写在这个方法里11
在这个方法里通过对象普通字段的self.request(客户端连接对象)来做通讯操作12
handle()客户端连接后自动执行方法13
4,ocketserver.ThreadingTCPServer(元祖类型IP端口, 创建的类名称)设置服务端的IP和端口,并且把创建的类传进去给模块14
使用方法:定义变量 = ocketserver.ThreadingTCPServer(元祖类型IP端口, 创建的类名称)15
如:shezhi = socketserver.ThreadingTCPServer(('127.0.0.1', 9999,), bf)16
5,serve_forever() 执行模块,循环等待客户端连接,能处理并发操作,一旦有客户端连接就会执行创建类里的handle方法17
使用方法:设置服务端的IP和端口变量.serve_forever() 18
如:shezhi.serve_forever()19
并发操作服务端代码20

#!/usr/bin/env python
# -*- coding:utf8 -*-
"""创建并发服务端"""
import socketserver #导入模块 """创建类"""
class bf(socketserver.BaseRequestHandler): #创建一个类,继承两个类socketserver和BaseRequestHandler,注意必须创建一个类来继承这两个模块内部指定的类
"""定义方法"""
def handle(self):
#对象自动封装了(客户端连接对象),(客户端IP和端口),(服务端对象)
# print self.request(客户端连接对象),self.client_address(客户端IP和端口),self.server(服务端对象)
b = self.request #客户端连接对象
b.sendall(bytes("你好欢迎你",encoding='utf-8')) #根据accept()接收到客户端连接对象信息,向客户端发送信息 while True: #当客户端连接成功后,进入循环,保持与客户端的通讯
j = b.recv(1024)#接收客户端发来的信息
j2 = str(j, encoding='utf-8') #将接收到的客户端信息转换成字符串
if j2 == "q": #判断客户端输入q,表示不再与服务端通讯,跳出循环,不在保持客户端的通讯
break
b.sendall(bytes(j2+"好",encoding='utf-8')) #将接收到客户端的信息加上一个好字,在发送给客户端 """设置服务端IP端口,并且把创建类传入socketserver模块"""
shezhi = socketserver.ThreadingTCPServer(('127.0.0.1', 9999,), bf) #设置服务端的IP和端口,并且把创建的类传进去 """执行socketserver模块"""
shezhi.serve_forever() #执行模块,循环等待客户端连接,能处理并发操作,一旦有客户端连接就会执行创建类里的handle方法


并发操作服务端流程图21

重点:注意传输数据时的粘包问题22
粘包就是一端发了两次信息或数据,第一次发的有可能计算机缓冲区还没发出去,第二次的信息就发到了缓冲区,这样两次的信息粘在一起发出去了,为了避免粘包问题,在第一次发送后接收一下另外一端是否接收到第一次发的信息,如果接收到才发第二次,如果没接收到就不发用,recv()阻塞,
Python基础-socketserver的更多相关文章
- Day1 - Python基础1 介绍、基本语法、流程控制
Python之路,Day1 - Python基础1 本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼 ...
- python利用socketserver实现并发套接字功能
本文实现利用python的socketserver这个强大的模块实现套接字的并发 目录结构如下: 测试文件请放在server_file文件夹里面 server.py #!/usr/bin/env py ...
- python基础1-转自金角大王
Python之路,Day1 - Python基础1---转自金角大王 本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 ...
- Python基础教程 - Tdcqma
1.1 普通字符串 1.21 错误与异常 1.41 XXXXXX 1.61 XXXXXX 1.81 XXXXXX 1.101 XXXXXX 1.2 转义字符串 1.22 装饰器 1 ...
- 【转】Python基础语法
[转]Python基础语法 学习一门编程语言,通常是学习该语言的以下几个部分的内容: 基础语法:如,变量的声明与调用.基本输出语句.代码块语法.注释等: 数据类型:通常都为 数字.字符串.布尔值.数组 ...
- python基础之socket编程 (转自林海峰老师)
python基础之socket编程 阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...
- python基础系列教程——Python3.x标准模块库目录
python基础系列教程——Python3.x标准模块库目录 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata ...
- python 基础网络编程2
python 基础网络编程2 前一篇讲了socketserver.py中BaseServer类, 下面介绍下TCPServer和UDPServer class TCPServer(BaseServer ...
- python 基础网络编程1
python 基础网络编程1 Source code: Lib/socketserver.py lib的主目录下有一个sockserver.py文件, 里面是python基本的网络编程模型 共有一个b ...
随机推荐
- Learning-MySQL【2】:MySQL存储引擎及数据库的操作管理
一.存储引擎 存储引擎实际上就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据.存储引擎也可以称为表类型. MySQL提供了插件式(pluggable)的存储引擎,存储引擎是基于表的.同一 ...
- Java三种注释
单行注释:// 注释内容 多行注释:/*... 注释内容....*/ 文本注释:/**.. 注释内容....*/ 这种注释可以用来自动地生成文档.在JDK中有个 ...
- Hadoop数据类型
hadoop包装了java的基本数据类型使他们实现以上的接口而且给予实现细节,这些类都实现了WritableComparable接口,能够在不同的hadoop节点之间毫无障碍的传输了.
- js实现往数组中添加非存在的对象,如果存在就改变键值。
let arr = [] // 数组中元素数据类型为{name: 'bb', age: 12} // 现在需求是,将每次获得的新对象{name: '', age: }push到数组arr中,但前提是数 ...
- 将npm的注册表源设置为国内的镜像
1.国内用户,建议将npm的注册表源设置为国内的镜像,可以大幅提升安装速度 2.国内优秀npm镜像推荐及使用:http://riny.net/2014/cnpm/ 淘宝npm镜像 ·搜索地址:http ...
- Anaconda 创建环境
2019-03-25 17:10:51 Anaconda 给不同的项目创建不同的环境真的非常重要,最近在使用flask的时候在base环境中安装flask-bootstrap,竟然将我原本的py3.7 ...
- [Jenkins] 配置任务中的坑s
Jenkins 坑1:sh: adb: command not found 背景:在任务中使用了adb命令 adb 使用时要在服务器上配Android-home的环境变量的 配置完成之后发现在服务器上 ...
- 基于TCAM 的高速路由查找
摘要 随着路由器接口速率的提高,传统的软件路由查找机制已经不能满足要求.目前常见的硬件解决方案是采用TCAM实现关键词 TCAM,路由查找,最长前缀匹配. 1.引言 路由器转发IP 分组时,转发引擎需 ...
- 『TensotFlow』转置卷积
网上解释 作者:张萌链接:https://www.zhihu.com/question/43609045/answer/120266511来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- 菜鸟脱壳之脱壳的基础知识(三)——寻找OEP
这节我们来讲讲如何寻找一个程序的OEP,即Original Entry Point.一些PE加壳程序在被加密的程序上面加了一个区段(有的壳也会合并区段),当外壳代码执行完毕以后,会跳到程序的本身的代码 ...