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的更多相关文章

  1. Day1 - Python基础1 介绍、基本语法、流程控制

    Python之路,Day1 - Python基础1   本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼 ...

  2. python利用socketserver实现并发套接字功能

    本文实现利用python的socketserver这个强大的模块实现套接字的并发 目录结构如下: 测试文件请放在server_file文件夹里面 server.py #!/usr/bin/env py ...

  3. python基础1-转自金角大王

    Python之路,Day1 - Python基础1---转自金角大王   本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 ...

  4. Python基础教程 - Tdcqma

      1.1 普通字符串 1.21 错误与异常 1.41 XXXXXX 1.61 XXXXXX 1.81 XXXXXX 1.101 XXXXXX 1.2 转义字符串 1.22 装饰器         1 ...

  5. 【转】Python基础语法

    [转]Python基础语法 学习一门编程语言,通常是学习该语言的以下几个部分的内容: 基础语法:如,变量的声明与调用.基本输出语句.代码块语法.注释等: 数据类型:通常都为 数字.字符串.布尔值.数组 ...

  6. python基础之socket编程 (转自林海峰老师)

    python基础之socket编程   阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...

  7. python基础系列教程——Python3.x标准模块库目录

    python基础系列教程——Python3.x标准模块库目录 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata ...

  8. python 基础网络编程2

    python 基础网络编程2 前一篇讲了socketserver.py中BaseServer类, 下面介绍下TCPServer和UDPServer class TCPServer(BaseServer ...

  9. python 基础网络编程1

    python 基础网络编程1 Source code: Lib/socketserver.py lib的主目录下有一个sockserver.py文件, 里面是python基本的网络编程模型 共有一个b ...

随机推荐

  1. jQuery validator plugin之Plugin Method

    原文 .validate() validate( [options ] ) options Type: Object debug (default: false) Type: Boolean Enab ...

  2. idea maven列表有问题的

     idea maven列表有问题的,覆盖   C:\Users\用户名\.IntelliJIdea2017.2\system\Maven\Indices路径大致在这里  文件为 Indices.rar ...

  3. 力扣(LeetCode)463. 岛屿的周长

    给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域. 网格中的格子水平和垂直方向相连(对角线方向不相连).整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地 ...

  4. icpc2018-焦作-E Resistors in Parallel-数论+大数

    http://codeforces.com/gym/102028/problem/E 定义n种电阻,阻值r[i]={ inf | i%d2==0 && d>1 ,   i | e ...

  5. 详解Oracle partition分区表

    随着表中行数的增多,管理和性能性能影响也将随之增加.备份将要花费更多时间,恢复也将 要花费更说的时间,对整个数据表的查询也将花费更多时间.通过把一个表中的行分为几个部分,可以减少大型表的管理和性能问题 ...

  6. ZZW原创_rsync同步时由于注释问题引起的@ERROR: chdir failed

    1.需求:A机器同步文件到B机器 2.问题: A机器执行如下命令: [root@sv0379 rsync]# rsync -vzrtopg  --password-file=/usr/local/rs ...

  7. kafka consumer 指定 offset,进行消息回溯

    kafka consumer 如何根据 offset,进行消息回溯?下面的文档给出了 demo: https://cwiki.apache.org/confluence/display/KAFKA/0 ...

  8. exadata cellcli

    cellcli [port_number] [-n] [-m] [-xml] [-v | -vv | -vvv] [-x] [-e command] The following table lists ...

  9. proxy Static方式

    package com.xk.spring.kp04_aop.proxy.s1_static; public interface IStudentService { public void save( ...

  10. java中求余%与取模floorMod的区别

    初学java的时候接触的%这个符号 百分号? 求余? 取模? 我只知道不是百分号,好像是求余,听别人那叫求模运算符,跟求余一样,于是我便信了. 思考之后开始迷糊,然后经过多次考证得到以下结论. 首先, ...