基于python socketserver框架全面解析

发布时间 - 2026-01-11 03:20:58    点击率:

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网络编程:socketserver的基本使用方法实例分析  # Python探索之SocketServer详解  # 利用Python中SocketServer 实现客户端与服务器间非阻塞通信  # Python使用SocketServer模块编写基本服务器程序的教程  # 实例讲解Python中SocketServer模块处理网络请求的用法  # python网络编程之TCP通信实例和socketserver框架使用例子  # Python网络编程之socket与socketserver  # 子类  # 就能  # 多个  # 客户端  # 给大家  # 类中  # 的是  # 是一个  # 使用了  # 在这  # 当我  # 我很  # 要注意  # 希望能  # 采用了  # 如果不是  # 这篇  # 会去  # 说白了  # 这让 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  Laravel如何使用Collections进行数据处理?(实用方法示例)  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  香港服务器部署网站为何提示未备案?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  如何在阿里云服务器自主搭建网站?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  javascript日期怎么处理_如何格式化输出  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  网站优化排名时,需要考虑哪些问题呢?  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  Laravel如何实现用户密码重置功能?(完整流程代码)  如何在VPS电脑上快速搭建网站?  南京网站制作费用,南京远驱官方网站?  开心动漫网站制作软件下载,十分开心动画为何停播?  大连 网站制作,大连天途有线官网?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  javascript读取文本节点方法小结  详解Android——蓝牙技术 带你实现终端间数据传输  网站建设整体流程解析,建站其实很容易!  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  如何快速登录WAP自助建站平台?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Python数据仓库与ETL构建实战_Airflow调度流程详解  详解jQuery中基本的动画方法  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel观察者模式如何使用_Laravel Model Observer配置  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】