基于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操作MySQL数据库的方法分享
May 29 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
python3实现网络爬虫之BeautifulSoup使用详解
Dec 19 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
python Tkinter的图片刷新实例
Jun 14 Python
pyqt 多窗口之间的相互调用方法
Jun 19 Python
PyQt Qt Designer工具的布局管理详解
Aug 07 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 Python
Python Matplotlib绘图基础知识代码解析
Aug 31 Python
利用python如何实现猫捉老鼠小游戏
Dec 04 Python
python BeautifulSoup库的安装与使用
Dec 17 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
JpGraph php柱状图使用介绍
2011/08/23 PHP
php不写闭合标签的好处
2014/03/04 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
2019/03/21 PHP
PHP单例模式实例分析【防继承,防克隆操作】
2019/05/22 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
javascript中简单的进制转换代码实例
2013/10/26 Javascript
jQuery事件用法实例汇总
2014/08/29 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
React组件中的this的具体使用
2018/02/28 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
python中reader的next用法
2018/07/24 Python
python selenium firefox使用详解
2019/02/26 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
python scatter函数用法实例详解
2020/02/11 Python
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
html5组织文档结构_动力节点Java学院整理
2017/07/11 HTML / CSS
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
会计应聘求职信范文
2013/12/17 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
环保倡议书格式范文
2014/05/14 职场文书
优化经济发展环境工作总结
2015/08/11 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
导游词之临安白水涧
2019/11/05 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python