基于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 StringIO模块实现在内存缓冲区中读写数据
Apr 08 Python
Python连接PostgreSQL数据库的方法
Nov 28 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
Feb 03 Python
python爬取淘宝商品详情页数据
Feb 23 Python
pandas 两列时间相减换算为秒的方法
Apr 20 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
Python写一个基于MD5的文件监听程序
Mar 11 Python
python 实现批量替换文本中的某部分内容
Dec 13 Python
如何通过python实现全排列
Feb 11 Python
Python 实现向word(docx)中输出
Feb 13 Python
Python API len函数操作过程解析
Mar 05 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
Dec 08 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读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
php post换行的方法
2020/02/03 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
阻止表单提交按钮多次提交的完美解决方法
2016/05/16 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
概述jQuery中的ajax方法
2016/12/16 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
2017/05/08 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
js动态生成表格(节点操作)
2021/01/12 Javascript
在windows系统中实现python3安装lxml
2016/03/23 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
python交换两个变量的值方法
2019/01/12 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
美国美发品牌:Bumble and Bumble
2016/10/08 全球购物
软件测试题目
2013/02/27 面试题
2014全国两会学习心得体会2000字
2014/03/10 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
本科毕业生应聘求职信
2014/07/06 职场文书
离婚财产分配协议书
2014/10/21 职场文书
导游词之介休绵山
2019/12/31 职场文书