基于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使用函数默认值实现函数静态变量的方法
Aug 18 Python
Python构造函数及解构函数介绍
Feb 26 Python
Python中的hypot()方法使用简介
May 18 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
tensorflow实现逻辑回归模型
Sep 08 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
Sep 17 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
Python使用Opencv实现图像特征检测与匹配的方法
Oct 30 Python
python读写Excel表格的实例代码(简单实用)
Dec 19 Python
Spring http服务远程调用实现过程解析
Jun 11 Python
Python中猜拳游戏与猜筛子游戏的实现方法
Sep 04 Python
如何通过一篇文章了解Python中的生成器
Apr 02 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文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
PHP请求远程地址设置超时时间的解决方法
2016/10/29 PHP
关于PHP中字符串与多进制转换函数的实例代码
2016/11/03 PHP
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
JavaScript中的类继承
2010/11/25 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
JavaScript结合HTML DOM实现联动菜单
2017/04/05 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
新手入门带你学习JavaScript引擎运行原理
2019/06/24 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
python中使用enumerate函数遍历元素实例
2014/06/16 Python
介绍Python中的fabs()方法的使用
2015/05/14 Python
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python 多进程并发操作中进程池Pool的实例
2017/11/01 Python
解决python给列表里添加字典时被最后一个覆盖的问题
2019/01/21 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
Python requests模块实例用法
2019/02/11 Python
python多线程扫描端口(线程池)
2019/09/04 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
兼职业务员岗位职责
2014/01/01 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
学习心理学的体会
2014/11/07 职场文书
学校党员干部承诺书
2015/05/04 职场文书
证婚人致辞精选
2015/07/28 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
导游词之平津战役纪念馆
2019/11/04 职场文书