基于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通过pil模块将raw图片转换成png图片的方法
Mar 16 Python
python调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
使用Python保存网页上的图片或者保存页面为截图
Mar 05 Python
深入理解Django的中间件middleware
Mar 14 Python
flask中过滤器的使用详解
Aug 01 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
Jan 29 Python
Python修改文件往指定行插入内容的实例
Jan 30 Python
Python求均值,方差,标准差的实例
Jun 29 Python
安装PyInstaller失败问题解决
Dec 14 Python
Python3中的f-Strings增强版字符串格式化方法
Mar 04 Python
python 实现定时任务的四种方式
Apr 01 Python
PyQt5爬取12306车票信息程序的实现
May 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限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
神盾加密解密教程(二)PHP 神盾解密
2014/06/08 PHP
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
Yii 2.0在Grid中格式化时间方法示例
2017/06/06 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
实例介绍PHP删除数组中的重复元素
2019/03/03 PHP
表单的一些基本用法与技巧
2006/07/15 Javascript
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
Javascript中判断对象是否为空
2015/06/10 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
2015/10/23 Javascript
理解JS绑定事件
2016/01/19 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
2016/07/14 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
2018/05/23 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
vue vant Area组件使用详解
2019/12/09 Javascript
python实现文件快照加密保护的方法
2015/06/30 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
Java分治归并排序算法实例详解
2017/12/12 Python
python socket 聊天室实例代码详解
2019/11/14 Python
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
《观舞记》教学反思
2014/04/16 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
学校开除通知书
2015/04/25 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
python中%格式表达式实例用法
2021/06/18 Python
Python+Appium自动化测试的实战
2021/06/30 Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python