基于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抓取网页内容示例分享
Feb 24 Python
Python内置的字符串处理函数详细整理(覆盖日常所用)
Aug 19 Python
使用django-suit为django 1.7 admin后台添加模板
Nov 18 Python
Python基于Tkinter的HelloWorld入门实例
Jun 17 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
Dec 25 Python
Python logging模块用法示例
Aug 28 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
使用TensorFlow对图像进行随机旋转的实现示例
Jan 20 Python
python等待10秒执行下一命令的方法
Jul 19 Python
使用python操作lmdb对数据读取的实例
Dec 11 Python
MoviePy常用剪辑类及Python视频剪辑自动化
Dec 18 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简单实现无限分类树形列表的方法
2015/03/27 PHP
PHP 接入微信扫码支付总结(总结篇)
2016/11/03 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
你必须知道的Javascript知识点之&quot;字面量和对应类型&quot;说明介绍
2013/04/23 Javascript
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
jQuery的remove()方法使用详解
2015/08/11 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
scrapy spider的几种爬取方式实例代码
2018/01/25 Python
django静态文件加载的方法
2018/05/20 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
python 6行代码制作月历生成器
2020/09/18 Python
python函数超时自动退出的实操方法
2020/12/28 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
2021/02/26 Python
英国儿童鞋和靴子:Start-Rite
2019/05/06 全球购物
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
师范大学应届生求职信
2013/11/21 职场文书
自我评价优秀范文分享
2013/11/30 职场文书
农村门前三包责任书
2014/07/25 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
入伍通知书
2015/04/23 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
九年级数学教学反思
2016/02/17 职场文书