基于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的正则表达式re模块的常用方法
Mar 09 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
Python KMeans聚类问题分析
Feb 23 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
Apr 17 Python
python ipset管理 增删白名单的方法
Jan 14 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
Python+Pyqt实现简单GUI电子时钟
Feb 22 Python
python lambda表达式在sort函数中的使用详解
Aug 28 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
May 18 Python
python 制作python包,封装成可用模块教程
Jul 13 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下MAIL的另一解决方案
2006/10/09 PHP
模仿OSO的论坛(四)
2006/10/09 PHP
PHP获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
详解webpack 多入口配置
2017/06/16 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
vue-cli3脚手架的配置及使用教程
2018/08/28 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
解决VUE双向绑定失效的问题
2019/10/29 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Pthon批量处理将pdb文件生成dssp文件
2015/06/21 Python
利用Python循环(包括while&amp;for)各种打印九九乘法表的实例
2017/11/06 Python
python实现对excel进行数据剔除操作实例
2017/12/07 Python
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
python Dijkstra算法实现最短路径问题的方法
2019/09/19 Python
通过python实现windows桌面截图代码实例
2020/01/17 Python
python实现贪吃蛇游戏源码
2020/03/21 Python
python实现单机五子棋
2020/08/28 Python
什么是事务?为什么需要事务?
2012/01/09 面试题
解释下面关于J2EE的名词
2013/11/15 面试题
大学生毕业鉴定
2014/01/31 职场文书
新闻专业学生的自我评价
2014/02/13 职场文书
财务负责人任命书
2014/06/06 职场文书
买房协议书范本
2014/10/23 职场文书
Golang并发工具Singleflight
2022/05/06 Golang