在《python---socket模块》中通过socket模块实现了串行处理的socket通信

在python中可以通过socketserver模块实现并发通信,而socketserver之所以能实现并发,是通过IO多路复用和多进程、多线程实现的

SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端。即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求。

下面是使用socketserver模块实现多线程并发处理请求的示例

服务器端

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'zhoufeng'

import socketserver

class MyServer(socketserver.BaseRequestHandler):  #自定义请求处理类,继承自BaseRequestHandler类
    def handle(self):  #重写handle方法,BaseRequestHandler中的handle方法为空
        conn=self.request  #建立一个通信连接,类似socket模块中的accept方法
        conn.sendall(bytes('欢迎致电 10086,请输入xxx',encoding='utf8'))   #发送比特形式的数据

        while True:
            data=conn.recv(1024)   #接收数据
            print('[%s] says:%s' %(self.client_address,data.decode()))     #client_address表示客户端地址
            conn.sendall(data.upper())      #发送数据

if __name__=='__main__':
    #ThreadingTCPServer类有两个参数,一个套接字元组,一个请求处理类
    #套接字元组('127.0.0.1',8009)
    #这里的请求处理类是我们自定义的MyServer
    #请求处理类也可以是BaseRequestHandler的派生类StreamRequestHandler和DatagramRequestHandler
    #每过来一个请求,就会生成一个server实例(可以理解为一个线程)
    server=socketserver.ThreadingTCPServer(('127.0.0.1',8009),MyServer)
    #serve_forever方法是什么作用?
    server.serve_forever()

客户端

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'zhoufeng'

import socket
ip_port=('127.0.0.1',8009)
s=socket.socket()
s.connect(ip_port)
welcome_msg=s.recv(1024)

print("from server:",welcome_msg.decode())

while True:
    #发消息
    send_data=input(">>: ").strip()
    if len(send_data)==0:continue
    s.sendall(bytes(send_data,encoding='utf8'))

    #收消息
    recv_data=s.recv(1024)
    print(str(recv_data,encoding='utf-8'))

s.close()

ThreadingTCPServer源码剖析

ThreadingTCPServer的类图关系如下:

内部调用流程为:

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

python---socketserver模块的更多相关文章

  1. Python socketserver模块解析

    参考:https://blog.csdn.net/qq_33733970/article/details/79153938 1.功能简介 socketserver模块是对socket模块的再封装,用于 ...

  2. python - socketserver 模块应用

    server端: import socketserver import subprocess import json import struct class MyTCPHandler(socketse ...

  3. 浅析python中socketserver模块使用

    虽然说用python编写简单的网络程序狠方便,但是复杂一点的网络程序还是用现成的框架比较好,这样就可以专心事物逻辑,而不是套接字的各种细节.Socketserver模块简化了编写网络服务程序,同时so ...

  4. python 内置标准库socketserver模块的思考

    socketserver模块简化了编写网络服务器的任务, 在很大程度上封装了一些操作, 你可以看成是事件驱动型的设计, 这很不错.它定义了两个最基本的类--服务器类 BaseServer, 请求处理类 ...

  5. Python网络编程(3)——SocketServer模块与简单并发服务器

    主要类型 该模块有四个比较主要的类,其中常用的是 TCPServer 和 UDPServer. 1. TCPServer 2. UDPServer 3. UnixStreamServer,类似于TCP ...

  6. SocketServer模块 《Python核心编程(第3版)》——2.5

    本文内容参考文章地址: https://m.aliyun.com/yunqi/articles/93088/ SocketServer模块 SocketServer是标准库中的一个高级模块(Pytho ...

  7. python 网络编程之socket开发和socketserver模块

    一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...

  8. python网络编程socketserver模块(实现TCP客户端/服务器)

    摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...

  9. Python进阶----UDP协议使用socket通信,socketserver模块实现并发

    Python进阶----UDP协议使用socket通信,socketserver模块实现并发 一丶基于UDP协议的socket 实现UDP协议传输数据 代码如下:

  10. Python网络编程(2)-粘包现象及socketserver模块实现TCP并发

    1. 基于Tcp的远程调用命令实现 很多人应该都使用过Xshell工具,这是一个远程连接工具,通过上面的知识,就可以模拟出Xshell远程连接服务器并调用命令的功能. Tcp服务端代码如下: impo ...

随机推荐

  1. C# List 的一些操作 (两List元素是否想同,List是否包含在另一个List中)

    一. 假设有两个List<T>对象 ,List1和List2,如下方法判断两个List是否相等 List1.All(List2.Contains) && List1.Cou ...

  2. virtualbox 使用USB引导启动安装系统

    想要测试u盘系统引导有没有问题,从u盘中启动我烧录的Android x86系统. 这种方式可以在已有空的虚拟机上直接启动U盘中的系统. 百度上能搜到的方式都是使用CMD命令(懒人表示太麻烦--),so ...

  3. SQL2005语句实现行转列,列转行

    在做报表时,经常需要将数据表中的行转列,或者列转行,如果不知道方法,你会觉得通过SQL语句来实现非常难.这里,我将使用pivot和unpivot来实现看似复杂的功能.这个功能在sql2005及以上版本 ...

  4. cordova环境配置

    1,安装node.js 2,安装git 3,安装cordova 安装node.js后,命令行输入:npm install -g cordova 加@版本号可安装指定版本,如:npm istall -g ...

  5. python---psutil

    系统性能信息模块psutil psutil是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(CPU,内存,磁盘,网络等)信息,主要应用于系统监控,分析和限制系统资源及进程的管理,它实现了同等 ...

  6. OAF_开发系列04_实现OAF查询4种不同的实现方式的比较和实现(案例)

    2014-06-02 Created By BaoXinjian

  7. caffe:用自己的数据训练网络mnist

    画黑底白字的软件:KolourPaint. 假设所有"1"的图片放到名字为1的文件夹下.(0-9类似)..获取每个数字的名称文件后,手动表上标签.然后合成train.txt 1.获 ...

  8. linux默认编辑器 sublime

    开发人员把Vi improved简称Vim Vim编辑器再内存缓冲区中处理数据. 如果再启动Vim时未指定文件名,或者这个文件不存在,Vim会新开一段缓冲区域来编辑. 如果你再命令行下指定了一个已有文 ...

  9. css中 input的button默认原始的样子

    以往我们写css时,让一行文字垂直居中. 会设置line-height等于height比如: 当我把这个原理 放在button上时  会是这个样子的. 以下都是火狐浏览器环境 有没有发现一个现象,他们 ...

  10. LAN-LAN FREE-SERVER FREE

    注:本文转自http://taotao1240.blog.51cto.com/731446/839702 CU上有个板块叫“存储备份”,可见存储和备份是紧紧联系的.在看备份的时候,经常能看到LAN f ...