基于python socketserver框架全面解析


Posted in Python onSeptember 21, 2017

socketserver框架是一个基本的socket服务器端框架, 使用了threading来处理多个客户端的连接, 使用seletor模块来处理高并发访问, 是值得一看的python 标准库的源码之一

对于select网络框架的理解可以看 << 基于python select.select模块通信的实例讲解 >>。socketserver框架采用了selector框架来供你选择相适应的网络通信框架, 比如select, poll, epoll等。有了这些网络框架我们就能处理高并发的网络访问了.

先看看示例代码吧:

# coding: utf-8
import socketserver


class MyTCPHandler(socketserver.BaseRequestHandler):
 """
 The request handler class for our server.
 It is instantiated once per connection to the server, and must
 override the handle() method to implement communication to the
 client.
 """

 def handle(self):
  # self.request is the TCP socket connected to the client
  self.data = self.request.recv(1024).strip()
  print("{} wrote:".format(self.client_address[0]))
  print(self.data)
  # just send back the same data, but upper-cased
  self.request.sendall(self.data.upper())


if __name__ == "__main__":
 HOST, PORT = "localhost", 9999

 # Create the server, binding to localhost on port 9999
 # 如果子类没有某个方法或是属性, 就回去父类中调用
 with socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) as server:
  # Activate the server; this will keep running until you
  # interrupt the program with Ctrl-C
  server.serve_forever()

客户端:

# coding: utf-8
import socket


sk = socket.socket()
sk.connect(("127.0.0.1", 9999)) # 主动初始化与服务器端的连接
while True:
 send_data = input("输入发送内容:")
 sk.sendall(bytes(send_data, encoding="utf8"))
 if send_data == "byebye":
  break
 accept_data = str(sk.recv(1024), encoding="utf8")
 print("".join(("接收内容:", accept_data)))
sk.close()

我们创建一个继承自BaseRequestHandler类的TCP请求处理类, 说白了这个类就是我们自己封装的基于socket的recv()函数与send()函数的类, 而所谓的TCP请求处理类其实就是对socket服务器端的bind, listen, accept等处理的封装类, 而且这个封装的并不是简单的socket, 而是基于select或是epoll等网络框架的类, 我们调用这个类就能轻易地处理高并发的网络访问. 其实认真阅读源码, 你会发现整体的程序设计是基于事件驱动的, 事件驱动机制的三个要素: 消息(事件)队列, 消息(事件)触发, 事件循环。只不过socketserver框架的事件驱动机制就做到了socket的accept()方法那, 接下来的消息接受(recv)与发送(send)就没有在做封装成相应的事件来进行处理了。

在这里说一个要注意的地方, 我使用了ThreadingTCPServer()类响应多个客户端的连接, 但是当我阅读这个类的源码的时候, 表示很疑惑啊!

class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass

这让我很疑惑啊,再看看调用:

with socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) as server:
  # Activate the server; this will keep running until you
  # interrupt the program with Ctrl-C
  server.serve_forever()

这更疑惑, ThreadingTCPServer哪来的构造函数, 后来研究了一下, 原来当子类的某个函数或是属性发生调用时, 如果不是重载了父类的方法或是属性, 而且子类中没有这个方法或是属性, 就会去调用父类相对应的方法或是属性, 于是上面的就是调用了TCPServer的初始化函数__init__以及serve_forever(), 随后调用的是子类的Request_handler函数

程序结果:

基于python socketserver框架全面解析

基于python socketserver框架全面解析

以上这篇基于python socketserver框架全面解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中 ? : 三元表达式的使用介绍
Oct 09 Python
python基于右递归解决八皇后问题的方法
May 25 Python
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
Nov 19 Python
pycharm中连接mysql数据库的步骤详解
May 02 Python
Python selenium实现微博自动登录的示例代码
May 16 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
Jun 28 Python
python opencv 简单阈值算法的实现
Aug 04 Python
屏蔽Django admin界面添加按钮的操作
Mar 11 Python
Python导入数值型Excel数据并生成矩阵操作
Jun 09 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
python实现语音常用度量方法的代码详解
May 25 Python
Golang Web 框架Iris安装部署
Aug 14 Python
基于python select.select模块通信的实例讲解
Sep 21 #Python
Python实现小数转化为百分数的格式化输出方法示例
Sep 20 #Python
Python实现字符串格式化输出的方法详解
Sep 20 #Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
Sep 20 #Python
python select.select模块通信全过程解析
Sep 20 #Python
基于python的字节编译详解
Sep 20 #Python
MySQL适配器PyMySQL详解
Sep 20 #Python
You might like
php设计模式 Decorator(装饰模式)
2011/06/26 PHP
编写安全 PHP应用程序的七个习惯深入分析
2013/06/08 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
浅谈高大上的微信小程序中渲染html内容—技术分享
2018/10/25 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
Python读写配置文件的方法
2015/06/03 Python
安装Python和pygame及相应的环境变量配置(图文教程)
2017/06/04 Python
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
python获取代码运行时间的实例代码
2018/06/11 Python
Python闭包思想与用法浅析
2018/12/27 Python
Python中整数的缓存机制讲解
2019/02/16 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
python类中super() 的使用解析
2019/12/19 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
药学专业大专生的自我评价
2013/12/12 职场文书
大学学风建设方案
2014/05/04 职场文书
招股说明书范本
2014/05/06 职场文书
求职信内容怎么写
2014/05/26 职场文书
大学生感恩父母演讲稿
2014/08/28 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
判缓刑人员个人思想汇报
2014/10/10 职场文书
2014年部门工作总结
2014/11/12 职场文书
五好家庭申报材料
2014/12/20 职场文书
2015年领导班子工作总结
2015/05/23 职场文书
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis