基于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的常见命令注入威胁
Feb 18 Python
python和shell变量互相传递的几种方法
Nov 20 Python
Python使用Tkinter实现机器人走迷宫
Jan 22 Python
Python3 安装PyQt5及exe打包图文教程
Jan 08 Python
python+selenium实现自动化百度搜索关键词
Jun 03 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
详解python pandas 分组统计的方法
Jul 30 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
Python接口测试get请求过程详解
Feb 28 Python
python numpy库np.percentile用法说明
Jun 08 Python
Python3爬虫中Splash的知识总结
Jul 10 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
Jun 21 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
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
php xml实例 留言本
2009/03/20 PHP
php+mysql事务rollback&amp;commit示例
2010/02/08 PHP
YII2框架中使用yii.js实现的post请求
2017/04/09 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
jquery-easyui关闭tab自动切换到前一个tab
2010/07/29 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
Jquery异步请求数据实例代码
2011/12/28 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
[44:40]KG vs LGD 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
Python heapq使用详解及实例代码
2017/01/25 Python
python实现图片批量压缩程序
2018/07/23 Python
Python----数据预处理代码实例
2019/03/20 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
Python使用re模块验证危险字符
2020/05/21 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
联强国际笔试题面试题
2013/07/10 面试题
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
博士学位自我鉴定范文
2013/12/26 职场文书
房地产销售经理岗位职责
2014/01/01 职场文书
五月的鲜花活动方案
2014/08/21 职场文书
教师三严三实对照检查材料
2014/09/25 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
2015年团委副书记工作总结
2015/07/23 职场文书
如何使用SQL Server语句创建表
2022/04/12 SQL Server
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
2022/08/05 Java/Android