首页 > 编程语言 >32.Python基础篇-socketserver模块

32.Python基础篇-socketserver模块

时间:2024-12-21 18:21:04浏览次数:8  
标签:请求 socketserver Python 32 server 处理 服务器 客户端

socketserver模块是什么?

是 Python 中一个用于简化基于 socket 的网络服务实现的模块。它提供了一些高层次的类,帮助开发者更容易地实现网络服务。

可以实现并发请求处理

使用socketserver实现的server端,代码演示:

import socketserver  # 导入 socketserver 模块,用于简化基于 socket 的服务器开发

# 创建一个自定义的 TCP 服务器类,继承自 socketserver.ThreadingTCPServer
class ReusableTCPServer(socketserver.ThreadingTCPServer):
    allow_reuse_address = True  # 允许重用地址,这样服务器关闭后可以立即重新启动而不受地址占用问题的影响

# 创建一个请求处理类,继承自 socketserver.BaseRequestHandler
class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        # 进入一个循环,保持与客户端的通信
        while True:
            # 接收客户端发送的消息,最多接收 1024 字节,并解码为 UTF-8 字符串
            msg = self.request.recv(1024).decode('utf-8')
            print(msg)  # 输出客户端发送的消息
            
            # 如果客户端发送的是 'bye',则结束通信
            if msg == 'bye':
                self.request.send(b'bye')  # 发送 'bye' 回复客户端
                break  # 退出循环,结束处理
            
            # 否则,服务器等待用户输入回应消息
            server_msg = input(">>>")  # 提示服务器输入消息
            self.request.send(bytes(server_msg, encoding='utf-8'))  # 将服务器的消息发送给客户端,编码为 UTF-8 字节流

# 主程序入口
if __name__ == '__main__':
    # 创建一个 ReusableTCPServer 实例,绑定到地址 ('127.0.0.1', 8090),并使用 MyServer 作为请求处理类
    server = ReusableTCPServer(('127.0.0.1', 8090), MyServer)
    
    # 启动服务器,开始监听和处理客户端请求
    server.serve_forever()

上面这个server端代码可以实现与多个客户端同时通信,做到多线程处理消息。

自定义的两个类:

ReusableTCPServer类:

继承自 socketserver.ThreadingTCPServer。主要是为了设置 allow_reuse_address = True,允许服务器在关闭后立即重用端口地址,避免等待操作系统释放端口。

MyServer类:

继承自 socketserver.BaseRequestHandler,用于处理每个客户端的请求。

handle 方法中,服务器不断接收客户端的消息,并根据收到的消息响应。

两个父类的说明

BaseRequestHandler

用于处理每个客户端请求的基类,定义了 handle 方法来进行请求处理。

ThreadingTCPServer

是一个多线程的 TCP 服务器,能够并发处理多个客户端请求,每个连接都会由一个新线程处理,适合 I/O 密集型的应用场景。

总结

通过继承父类ThreadingTCPServer的功能。整体实现了多线程的服务端,能够并发处理多个客户端请求。

通过继承BaseRequestHandler,省去多余的步骤,直接在handler方法中处理消息即可。并且可以自动管理客户端的连接,为每个连接创建一个实例。可以简化代码,提高扩展性与可复用性。

 

标签:请求,socketserver,Python,32,server,处理,服务器,客户端
From: https://www.cnblogs.com/mingbo-1/p/18621020

相关文章

  • 31.Python基础篇-hmac模块
    hmac与hashlib模块的区别hmac模块基于hashlib提供的哈希算法,在计算哈希时加入了一个“密钥”。主要用于生成“消息认证码”(MAC),通过一个密钥和数据共同生成哈希值,以此来验证数据的完整性和身份。需要密钥,它的目的是防止消息篡改并验证消息是否来源于可信的发送方。hashlib......
  • python毕设 旅游景点推荐系统论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于旅游景点推荐系统的研究,现有研究主要集中在基于用户评价或固定算法的推荐方面,专门针对结合Python语言构建的旅游景点推荐系统的研......
  • Python中实现对数字字符串按位求和——sum()&map()
    要快速给数字字符串的每一位数求和,可以使用Python的内置函数来实现。以下是几种常见的方法:1.使用sum()和map()number_str='12345'result=sum(map(int,number_str))print(result)#输出:15解释:map(int,number_str):将字符串中的每一位字符转换为整数。m......
  • 升级 Z-BlogPHP 到 1.7.3.3260 后为什么会出现后台登录错误?
    升级Z-BlogPHP到1.7.3.3260版本后,后台登录可能会出现错误,主要是由于新版本增加了两个重要的安全保护功能:CSRF(跨站请求伪造)保护和验证码功能。这些功能旨在提高系统的安全性,防止未经授权的访问和自动化攻击。然而,由于某些主题或插件的兼容性问题,这些新增的安全功能可能会导致登......
  • 30.Python基础篇-socket模块
    介绍socket模块是用于实现网络通信的模块。它提供了底层网络操作的接口,使得用户可以通过网络实现客户端和服务器之间的数据传输。通过socket模块,程序可以通过网络进行数据传输、连接和通信。使用socket模块创建一个TCP服务server端代码#server端代码importsocketsk......
  • 【多维DP】【准NOI难度】力扣3251. 单调数组对的数目 II
    给你一个长度为n的正整数数组nums。如果两个非负整数数组(arr1,arr2)满足以下条件,我们称它们是单调数组对:两个数组的长度都是n。arr1是单调非递减的,换句话说arr1[0]<=arr1[1]<=…<=arr1[n-1]。arr2是单调非递增的,换句话说arr2[0]>=ar......
  • 【华为OD-E卷-寻找关键钥匙 100分(python、java、c++、js、c)】
    【华为OD-E卷-寻找关键钥匙100分(python、java、c++、js、c)】题目小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定密码K(升序的不重复小写字母组成)的箱子,并给出箱子编号,箱子编号为1~N。每个箱子中都有一个字符串s,字符串由大写字母、小写字母、数字、标点符号......
  • 【华为OD-E卷-最多提取子串数目 100分(python、java、c++、js、c)】
    【华为OD-E卷-最多提取子串数目100分(python、java、c++、js、c)】题目给定[a-z],26个英文字母小写字符串组成的字符串A和B,其中A可能存在重复字母,B不会存在重复字母,现从字符串A中按规则挑选一些字母,可以组成字符串B。挑选规则如下:同一个位置的字母只能挑选一次......
  • 数据结构与算法Python版 散列与区块链
    文章目录一、散列二、完美散列函数三、完美散列函数的应用-区块链一、散列散列Hashing构造一个新的数据结构,使得查找算法的复杂度降到O(1),这种概念称为“散列Hashing”由数据项的值来确定其存放位置,数据项应该出现在大概什么位置,就可以直接到那个位置看看数据项是......
  • 数据结构与算法Python版 顺序查找与二分查找
    文章目录一、顺序查找二、二分查找一、顺序查找顺序查找SequentialSearch通过下标,我们就可以按照顺序来访问和查找数据项,这种技术称为“顺序查找”如果数据项保存在如列表这样的集合中,我们会称这些数据项具有线性或者顺序关系在Python列表中,这些数据项的存储位置......