基于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的发展史
Sep 26 Python
Python中尝试多线程编程的一个简明例子
Apr 07 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
May 18 Python
python 去除txt文本中的空格、数字、特定字母等方法
Jul 24 Python
Python实现针对json中某个关键字段进行排序操作示例
Dec 25 Python
强悍的Python读取大文件的解决方案
Feb 16 Python
python 杀死自身进程的实现方法
Jul 01 Python
Django 创建/删除用户的示例代码
Jul 24 Python
用Python解数独的方法示例
Oct 24 Python
解决echarts中饼图标签重叠的问题
May 16 Python
Python 添加文件注释和函数注释操作
Aug 09 Python
教你使用TensorFlow2识别验证码
Jun 11 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类
2006/11/25 PHP
探讨多键值cookie(php中cookie存取数组)的详解
2013/06/06 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
yii实现图片上传及缩略图生成的方法
2014/12/04 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
php获取数据库结果集方法(推荐)
2017/06/01 PHP
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
jquery插件之easing使用
2010/08/19 Javascript
浅析javascript闭包 实例分析
2010/12/25 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
jquery ajax请求实例深入解析
2012/11/26 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
JavaScript作用域与作用域链深入解析
2013/12/06 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
python修改字典内key对应值的方法
2015/07/11 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
使用Tensorflow将自己的数据分割成batch训练实例
2020/01/20 Python
使用Python构造hive insert语句说明
2020/06/06 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
武汉东之林科技有限公司机试
2013/09/17 面试题
顶撞老师检讨书
2014/02/07 职场文书
经典公益广告词
2014/03/13 职场文书
同居协议书范本
2014/04/23 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
六查六看自查报告
2014/10/14 职场文书
国情备忘录观后感
2015/06/04 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
关于Numpy之repeat、tile的用法总结
2021/06/02 Python