基于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实现简单的socket server实例
Apr 29 Python
Python 实现简单的电话本功能
Aug 09 Python
浅谈Django REST Framework限速
Dec 12 Python
深入理解Python爬虫代理池服务
Feb 28 Python
解决python写入mysql中datetime类型遇到的问题
Jun 21 Python
Python 数值区间处理_对interval 库的快速入门详解
Nov 16 Python
python 在屏幕上逐字显示一行字的实例
Dec 24 Python
python实现扫描局域网指定网段ip的方法
Apr 16 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
Apr 27 Python
Python远程linux执行命令实现
Nov 11 Python
Pytorch实验常用代码段汇总
Nov 19 Python
Python函数对象与闭包函数
Apr 13 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页面静态化
2018/02/05 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
2010/05/13 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
常见JS验证脚本汇总
2015/12/01 Javascript
JavaScript中捕获/阻止捕获、冒泡/阻止冒泡方法
2016/12/07 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
python获取本地计算机名字的方法
2015/04/29 Python
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
python图像处理之镜像实现方法
2015/05/30 Python
python对DICOM图像的读取方法详解
2017/07/17 Python
Python设计模式之观察者模式简单示例
2018/01/10 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
python实现关键词提取的示例讲解
2018/04/28 Python
opencv实现简单人脸识别
2021/02/19 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
Python中如何引入第三方模块
2020/05/27 Python
python制作抽奖程序代码详解
2021/01/15 Python
Snapfish英国:在线照片打印和个性化照片礼品
2017/01/13 全球购物
装潢设计实习自我鉴定
2013/09/19 职场文书
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
优秀学生获奖感言
2014/02/15 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
小学生学习保证书
2015/02/26 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python
mybatis使用oracle进行添加数据的方法
2021/04/27 Oracle