基于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的SQLalchemy模块连接与操作MySQL的基础示例
Jul 11 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
Python实现的矩阵类实例
Aug 22 Python
python查询mysql,返回json的实例
Mar 26 Python
python爬取基于m3u8协议的ts文件并合并
Apr 26 Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 Python
浅析python中while循环和for循环
Nov 19 Python
python字符串,元组,列表,字典互转代码实例详解
Feb 14 Python
python用opencv 图像傅里叶变换
Jan 04 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
Feb 03 Python
Python连续赋值需要注意的一些问题
Jun 03 Python
Python实现8种常用抽样方法
Jun 27 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
Laravel学习教程之路由模块
2017/08/18 PHP
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
2014/02/11 Javascript
javascript不同类型数据之间的运算的转换方法
2014/02/13 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
JS实现常见的查找、排序、去重算法示例
2018/05/21 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
vue 全局环境切换问题
2019/10/27 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
2019/12/04 Javascript
Python中的类与对象之描述符详解
2015/03/27 Python
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
Python设计模式之门面模式简单示例
2018/01/09 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
对python实现合并两个排序链表的方法详解
2019/01/23 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
Pytorch高阶OP操作where,gather原理
2020/04/30 Python
Python 如何实现访问者模式
2020/07/28 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
公司活动方案范文
2014/03/06 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
司机岗位职责
2015/02/04 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书
女方离婚起诉书
2015/05/18 职场文书
导游词之塘栖古镇
2019/12/04 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python