socketserver用法列子
socketserver
socketserver内部使用IO多路复用以及“多线程”和“多进程”,从而实现并发处理多个客户端请求的scoket服务端。即,每个客户端请求连接到服务器时,socket服务端都会在服务器是创建一个“线程”或“进程”专门负责处理当前客户端的所有请求。
ThradingTCPServer
ThradingTCPServer实现的socket服务器内部会为每个client创建一个“线程”,该线程用来heels客户端进行交互
1,ThradingTCPServer 基础
使用ThradingTCPServer:
- 创建一个继承 socketserver.BaseRequestHandler 的类
- 类中必须定义一个名we诶handle 的方法
- 启动 ThradingTCPServer
记住一个原则:对tcp来说:self.request=conn
代码:

#!/usr/bin/env python3
import socketserver class Server(socketserver.BaseRequestHandler): #$ 必须继承BaseRequestHandler
def handle(self): #$ 必须有handle方法
print('New connection:',self.client_address)
while True:
data = self.request.recv(1024)
if not data:break
print('Client data:',data.decode())
self.request.send(data) if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1',8009),MyServer) #$ 实现多线程的socket
server.serve_forever() #$ 当前连接断开不会出现关闭或报错,可以与其他客户端继续连接

client端:

import socket
ip_port = ('127.0.0.1',8080)
sk = socket.socket()
sk.connect(ip_port) while True:
raw = input('>> ').strip()
sk.send(bytes(raw,'utf8'))
msg = sk.recv(1024)
print(str(msg,'utf8'))
sk.close()

2,ThradingTCPServer源码剖析
内部调用流程为:
- 启动服务端程序
- 执行 TCPServer.__init__方法,创建服务端socket对象并绑定IP和端口
- 执行 BaseServeer.__init__方法,将自定义的继承自socketserver.BaseRequestHandler 的类 MyRequestHandle赋值给 self.RequestHandlerClass
- 执行BaseServer.server_forever 方法,while 循环一直监听是否有客户端请求到达
- 当客户端连接到达服务器
- 执行ThreadingMixIn.proceess_request 方法,创建一个“线程”用来处理请求
- 执行 ThreadingMixIn.proceess_request _thread 方法
- 执行 BaseServer.finish_request 方法,执行 self.RequseetHandlerClass() 即:执行 自定义 MyRequestHandler 的构造方法(自动调用基类 BaseRequestHandler的构造方法,在该构造方法中又会调用MyRequestHandler的handle方法)
socketserver用法列子的更多相关文章
- 番外:socketserver用法
进击のpython ***** 番外:socketserver使用 是不是被一般写法,多进程写法,多线程写法甚至是协程写法搞的不可开交 云里雾里,仿佛将要放弃~再配上服务器要服务多个客户端 完蛋了,全 ...
- 网络编程之socket的运用
一,socket用法 socket是什么 ? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐 ...
- 网络编程------socketserver模块以及socket模块的更多用法.
socketserver模块 内置模块 (其实现原理为并发) socketserver这个模块主要是为了解决: TCP协议中,服务器不能同时连接多个客户端的问题 是处于socket抽象层和应用层之间的 ...
- Learn day9 粘包\struct用法\hashlib校验\socketserver并发\模块引入\进程\join\守护进程
1.粘包现象 总结 : 导致黏包现象的两种情况 hello,worl d (1) 在发送端,发送数据太快,频繁发送 (2) 在接收端,接收数据太慢,延迟截取 # ### 服务端 import sock ...
- SQL用法操作合集
SQL用法操作合集 一.表的创建 1.创建表 格式: 1 CREATE TABLE 表名 2 (列名 数据类型(宽度)[DEFAULT 表达式][COLUMN CONSTRAINT], 3 ... ...
- android的logcat详细用法
Android日志系统提供了记录和查看系统调试信息的功能.日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命 令来查看和使用. 使用logcat命令 你可以用 logc ...
- 深入分析@Transactional的用法
关键词:事务, 编程式事务,声明式事务.spring 事务管理.AOP事务增强.@Transactional 在分析深入分析@Transactional的使用之前,我们先回顾一下事务的一些基本内容. ...
- SQL EXEC 命令用法
EXEC命令有两个用法: 1.执行一个存储过程,或者执行一个动态批次. 2.批次是一个内容为SQL语句的字符串. 举列子: 1.exec name_proc :没有参数 exec name_proc ...
- MySql 中 case when then else end 的用法
解释: SELECT case -------------如果 when sex='1' then '男' ---------- ...
随机推荐
- 关于 Capella 需要纠正的语音
li { font-size: 18px; } 关于 Capella 需要纠正的语音 持续更新 浊塞音声带要振动 区分 [θ]/[ð] 和 [t̪],注意舌位 [ɫ] 的舌位,切记不能圆唇 [æ] 的 ...
- Bayesian optimisation for smart hyperparameter search
Bayesian optimisation for smart hyperparameter search Fitting a single classifier does not take long ...
- AutoESL与Xilinx那些人和事
大年三十,看到Xilinx收购AutoESL的新闻, 顿时觉得今年特别喜庆,于是,连春晚也懒得骂了. 本想立即写一篇博文八卦一番, 怎奈亲朋好友饭局不断,一直拖到今天才动笔. 与一年前Xilinx宣布 ...
- 【CodeForces】576 C. Points on Plane
[题目]C. Points on Plane [题意]给定坐标系中n个点的坐标(范围[0,10^6]),求一种 [ 连边形成链后总长度<=2.5*10^9 ] 的方案.n<=10^6. [ ...
- form表单有条件的提交
form表单提交数据,比如,积分,score,在0--100之间 var score = $('#score').val(); if(score !=''){ if(isNaN(score)){ la ...
- 【leetcode 简单】 第七题 合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...
- Redis数据类型之字符串(string)
1. string类型简介 string类型是二进制安全的,能够存储任意类型的字符串. string类型是最常用到的数据类型,一种常用的用法就是将对象格式化为JSON字符串然后放到redis中,取出来 ...
- docker之安装和基本使用(一)
前言 开始折腾docker. 主要概念 容器:独立运行的一个或一组应用,与其他应用完全独立. 镜像:用于创建 Docker容器的模板. 仓库:用于收纳镜像文件,可以理解为代码控制中的代码仓库 注意: ...
- 2017 ACM - ICPC Asia Ho Chi Minh City Regional Contest
2017 ACM - ICPC Asia Ho Chi Minh City Regional Contest A - Arranging Wine 题目描述:有\(R\)个红箱和\(W\)个白箱,将这 ...
- C/C++——C语言数组名与指针
版权声明:原创文章,转载请注明出处. 1. 一维数组名与指针 对于一维数组来说,数组名就是指向该数组首地址的指针,对于: ]; array就是该数组的首地址,如果我们想定义一个指向该数组的指针,我们可 ...