基于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下载Bing图片(代码)
Nov 07 Python
python用装饰器自动注册Tornado路由详解
Feb 14 Python
Python对象类型及其运算方法(详解)
Jul 05 Python
用python3教你任意Html主内容提取功能
Nov 05 Python
Django 重写用户模型的实现
Jul 29 Python
django-crontab 定时执行任务方法的实现
Sep 06 Python
Django-rest-framework中过滤器的定制实例
Apr 01 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 Python
Python中and和or如何使用
May 28 Python
详解python中的lambda与sorted函数
Sep 04 Python
python 调用Google翻译接口的方法
Dec 09 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 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
最小化数据传输――在客户端存储数据
2006/10/09 PHP
PHP+javascript模拟Matrix画面
2006/10/09 PHP
基于PHP服务端图片生成缩略图的方法详解
2013/06/20 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
js多级树形弹出一个小窗口层(非常好用)实例代码
2013/03/19 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
2017/02/19 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
2019/11/15 Javascript
js实现烟花特效
2020/03/02 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
python验证身份证信息实例代码
2019/05/06 Python
python顺序执行多个py文件的方法
2019/06/29 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
市场督导岗位职责
2015/04/10 职场文书
幸福来敲门观后感
2015/06/04 职场文书
海上钢琴师的观后感
2015/06/11 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python
GoFrame框架数据校验之校验结果Error接口对象
2022/06/21 Golang
box-shadow单边阴影的实现
2023/05/21 HTML / CSS