Socket编程,SocketServer模块
一、SocketServer的几种类型
面向远程:
TCP 协议链接:socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True).
UDP 协议链接:socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True).
本地服务:
UnixStream:socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
UnixDatagram:socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
二、几种服务器的继承关系
+------------+ | BaseServer | +------------+ | v +-----------+ +------------------+ | TCPServer |------->| UnixStreamServer | +-----------+ +------------------+ | v +-----------+ +--------------------+ | UDPServer |------->| UnixDatagramServer | +-----------+ +--------------------+
1.2 如何创建一个SocketServer 以Tcp为列
First:
创建一个请求处理类PersonalTcpHandle ,继承 BaseRequestHandler, 并且还有重写父类的handle()方法
Second:
必须实例化 TCPServer, 并传送服务端的 IP 、Port 和上面创建的请求处理类给这个TCPServer( (host, port), PersonalTcpHandle)
Thrid:
接着使用 server.handle_request() --->只执行一个请求
server.serve_forever() --->永远的执行下去,执行很多请求
二、’代码实现
import socketserver
class PersonalTcpHandle(socketserver.BaseRequestHandler): #继承父类请求处理类
""" 每来一个请求都会实例化一次这个类"""
def handle(self): #重写handle 方法,客户端来的所有请求都在这被处理响应
"""该类接受客户端发送的数据,并在处理后返回"""
self.data = self.request.recv(1024).strip() #这儿的 self.request 就是socket里面的 sock ,addr = server.accept() 里面的 sock
""" Do someing with self.data and then return the result to client"""
self.request.sendall('处理后的数据') #注意必须为bytes 类型
if __name__ == "__main__":
host, port = "localhost", 3309
server = socketserver.TCPServer((host, port), PersonalTcpHandle) #单线程
# server = socketserver.ThreadignTCPServer((host,port), PersonalTcpHandle) #多线程服务器, 建议使用
server.serve_forver(poll_interval= 1) #poll_interval 参数为每多少时间检查一次连接是否断开
这样就完成了一个多线程的TCPserver服务
人生还有意义。那一定是还在找存在的理由
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?