基于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随机生成信用卡卡号的实现方法
May 14 Python
使用Python来编写HTTP服务器的超级指南
Feb 18 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
python在非root权限下的安装方法
Jan 23 Python
python爬取淘宝商品详情页数据
Feb 23 Python
Windows下安装Django框架的方法简明教程
Mar 28 Python
Python线程之定位与销毁的实现
Feb 17 Python
一个可以套路别人的python小程序实例代码
Apr 09 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
Apr 07 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 Python
使用sublime text3搭建Python编辑环境的实现
Jan 12 Python
python实现ROA算子边缘检测算法
Apr 05 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中的正规表达式(一)
2006/10/09 PHP
轻松修复Discuz!数据库
2008/05/03 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
javascript 页面只自动刷新一次
2009/07/10 Javascript
JS重要知识点小结
2011/11/06 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
关于vue编译版本引入的问题的解决
2018/09/17 Javascript
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
Python 正则表达式操作指南
2009/05/04 Python
Python读取指定目录下指定后缀文件并保存为docx
2017/04/23 Python
Python中异常重试的解决方案详解
2017/05/05 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
Python发送http请求解析返回json的实例
2018/03/26 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
Django框架HttpResponse对象用法实例分析
2019/11/01 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
python 字典访问的三种方法小结
2019/12/05 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
html5 兼容IE6结构的实现代码
2012/05/14 HTML / CSS
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
外贸业务员岗位职责
2013/11/24 职场文书
学校班班通实施方案
2014/06/11 职场文书
初中班长竞选稿
2015/11/20 职场文书
浅谈python中的多态
2021/06/15 Python
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB