Python --网络编程(SocketServer模块)

Python使用socketServer包搭建简易服务器过程详解 socketserver包提供5个Server类,这些单独使用这些Server类都只能完成同步的操作,他是一个单线程的,不能同时处理各个客户端的请求,只能按照顺序依次处理。两个Mixin类各自实现了多进程和多线程的功能(ForkingMixIn在Windows不支持)于是将这些同步类和Mixin类组合就实现了异步服务类的效果。由于server需要同时处理来自多个客户端的请求,需要提供异步的支持,所以通常使用上面的异步类创建服务器。 阅读详情

概述

  • socket编程过于底层,编程虽然有套路,但是想要写出健壮的代码还是比较困难的,所以很多语言都对socket底层API进行封装
  • Python的封装就是——socketserver模块。它是网络服务编程框架,便于企业级快速开发

类的继承关系

+------------+
| BaseServer |
+------------+
 |
 v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
 |
 v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+

SocketServer简化了网络服务器的编写

它有4个同步类:

  • TCPServer
  • UDPServer
  • UnixStreamServer
  • UnixDatagramServer

2个Mixin类:ForkingMixIn 和 ThreadingMixIn 类,用来支持异步。由此得到

  • class ForkingUDPServer(ForkingMixIn, UDPServer): pass
  • class ForkingTCPServer(ForkingMixIn, TCPServer): pass
  • class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
  • class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass

fork是创建多进程,thread是创建多线程
fork需要操作系统支持,Windows不支持

编程接口

socketserver.BaseServer(server_address, RequestHandlerClass)
需要提供服务器绑定的地址信息,和用于处理请求的RequestHandlerClass类
RequestHandlerClass类必须是BaseRequestHandler类的子类,在BaseServer中代码如下:

# BaseServer代码
class BaseServer:
	def __init__(self, server_address, RequestHandlerClass):
		"""Constructor. May be extended, do not override."""
		self.server_address = server_address
		self.RequestHandlerClass = RequestHandlerClass
		self.__is_shut_down = threading.Event()
		self.__shutdown_request = False
	def finish_request(self, request, client_address): # 处理请求的方法
		"""Finish one request by instantiating RequestHandlerClass."""
		self.RequestHandlerClass(request, client_address, self) # RequestHandlerClass构造

BaseRequestHandler类

它是和用户连接的用户请求处理类的基类,定义为
BaseRequestHandler(request, client_address, server)
服务端Server实例接收用户请求后,最后会实例化这个类
它被初始化时,送入3个构造参数:request, client_address, server自身
以后就可以在BaseRequestHandler类的实例上使用以下属性:

  • self.request是和客户端的连接的socket对象
  • self.server是TCPServer实例本身
  • self.client_address是客户端地址

这个类在初始化的时候,它会依次调用3个方法。子类可以覆盖这些方法

# BaseRequestHandler要子类覆盖的方法
class BaseRequestHandler:
    def __init__(self, request, client_address, server):
        self.request = request
        self.client_address = client_address
        self.server = server
        self.setup()
        try:
            self.handle()
        finally:
            self.finish()
     
    def setup(self): # 每一个连接初始化
        pass
    
    def handle(self): # 每一次请求处理
        pass
    
    def finish(self): # 每一个连接清理
        pass

测试代码

import threading
import socketserver

class Myhandler(socketserver.BaseRequestHandler):
    def handle(self):
        # super().handle() # 可以不调用,父类handle什么都没有做
        print('-' * 30)
        print(self.server) # 服务
        print(self.request) # 服务端负责客户端连接请求的socket对象
        print(self.client_address) # 客户端地址
        print(self
python 网络编程之socketserver模块 前言:(以下是基于我学习完python核心编程之网络编程篇章的个人知识输出,知识不算齐全,想深入的可自己再查阅书籍) 虽说用Python编写简单的网络程序很方便,但复杂一点的网络程序还是用现成的框架比较好。这样就可以专心事务逻辑,而不是套接字的各种细节。SocketServer模块简化了编写网络服务程序的任务。同时SocketServer模块也是Python标准库中很多服务器框架的基础。 阅读详情

相关推荐

Python之网络编程(socketserver模块详解、链接认证)

文章目录多线程对多客户端socketserver分类(2种)12个类的继承关系(原理)socketserver的实现效果认证链接的合法性加盐(hmac)对暗号 socketserver本质是基于socket进行的一个封装,将多线程并发功能集成到一个新的模块里,就叫socketserver; 它用来解决TCP套接字无法并发的问题,也就是无法一个服务端不能同时服务多个客户端的问题(UDP没有此问题,因...

Viewinfinitely的博客 3235

从动态规划到最优控制:Hamilton-Jacobi-Bellman (HJB) 方程的核心思想与应用

本文深入解析了Hamilton-Jacobi-Bellman (HJB) 方程的核心思想与应用,从动态规划到最优控制的演变过程。通过实际案例展示了HJB方程在机器人路径规划、工业机械臂优化等领域的实践价值,并探讨了数值求解方法和深度学习结合的神经HJB前沿进展。

weixin_28700411的博客 453

iOS逆向实战:绕过SSL Pinning抓取ChatGPT设备令牌

在移动应用安全与网络协议分析领域,中间人攻击是一种核心的流量拦截与分析技术。其原理是在客户端与服务器之间插入一个代理节点,通过伪造数字证书来解密和窥探HTTPS加密流量。这项技术的工程价值在于,它使开发者能够调试API、分析通信协议以及实现自动化集成。然而,许多高安全要求的应用(如金融、社交类App)会采用SSL Pinning(证书绑定)技术来抵御此类攻击,这为逆向工程带来了挑战。本文聚焦于一个具体的应用场景:如何针对启用了SSL Pinning的ChatGPT iOS客户端,通过特定的工具链(如Trol

weixin_28235889的博客 974

MS建模mmt

一、流程:1.定义好每个原子力场类型:Edit Sets(分组) 2.加H(一般是仅与Al-O八面体中的Al相连的O原子)、给H分组 3.“make P1”、校核化学式(正确与否) 4.扩成超晶胞(Na-mmt:4*1*1,Ca-mmt:4*2*1,illite:2*1*1,由化学式而定) 5.置换阳离子: mmt:模型中每 32 个 Si 4+有 1 个被 Al 3+ 取...

weixin_30721899的博客 2174

实战指南:基于华为Ascend NPU的大模型W8A8量化调优与精度提升

本文提供了一份基于华为Ascend NPU进行大模型W8A8量化的实战调优指南。详细介绍了从环境搭建、使用msmodelslim框架进行基础量化,到通过离群值抑制、校准集优化和量化回退等关键技术提升精度的全流程。旨在帮助开发者在华为NPU硬件上实现模型推理的显著加速,同时有效控制精度损失。

weixin_29227425的博客 271

保姆级教程:用Vue3+Element Plus快速搭建Flowable流程定义管理后台界面

本文提供了一份详细的Vue3+Element Plus教程,指导开发者快速搭建Flowable流程定义管理后台界面。从项目初始化、核心页面设计到响应式数据处理,全面覆盖前端开发关键步骤,帮助提升企业级应用开发效率。

weixin_42662293的博客 475

YOLOv11知识蒸馏实战:让小模型拥有大模型90%精度,速度提升3倍的终极教程

在self.alpha = alpha # 蒸馏损失权重self.temperature = temperature # 温度系数,控制分布平滑度# 输出分布蒸馏(KL散度损失)# 中间特征蒸馏(MSE损失,对齐中间层特征)# 总蒸馏损失知识蒸馏是YOLOv11在“小模型高性能部署”场景的“破局之法”——它让小模型能“站在大模型的肩膀上”,兼具速度与精度。从损失函数定义到多阶段训练,再到实战落地,本教程已为你铺就了一条清晰的路径。

m0_64661770的博客 801

28-3 文件上传漏洞 -白盒审计绕过

这行代码是用来获取文件名中最后一个点(.)后的部分,也就是文件的后缀名。这个函数会返回以最后一个点(.)开始到字符串末尾的部分,包括点(.)本身。然而,这段代码存在一个潜在的安全风险。攻击者可以利用多个点(.)来构造恶意文件名,以绕过后缀名检查。切换到bp将抓到的上传请求发送到重发器然后改包。先上传一个普通的php文件然后使用bp抓包。

weixin_43263566的博客 392

车载以太网测试-3【Wireshark介绍】

数据包捕获支持从多种网络接口(如以太网、Wi-Fi、蓝牙等)捕获数据包。可以实时捕获或从文件中读取已捕获的数据包。协议解析支持解析数百种网络协议(如 TCP/IP、HTTP、DNS、FTP 等)。能够深入解析协议头部和负载,帮助用户理解网络通信的细节。过滤功能提供强大的显示过滤器和捕获过滤器,帮助用户快速定位和分析感兴趣的数据包。支持基于协议、IP地址、端口号等多种条件的过滤。统计和分析提供多种统计工具,如流量图、会话统计、协议分层统计等。

车载网络测试工程师的博客 1989

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: python -- 网络编程(UDP编程)
下一篇: IO多种概念
鹿夏
博客等级 码龄8年 24粉丝 105原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值