python网络编程之sockerserver 模块
网络协议的最底层就是socket,基于原有socket模块,又封装了一层,就是socketserver
socketserver 为了实现tcp协议,server端的并发.
socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None)
创建socket对象的参数说明如下:
地址系列应为AF_INET(默认值), AF_INET => ipv4 AF_INET6, => ipv6 AF_UNIX,AF_CAN或AF_RDS.(AF_UNIX 域实际上是使用本地 socket [文件]来通信)同一机器 | |
---|---|
type | 套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。 SOCK_STREAM 是基于TCP的,有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料传送。 SOCK_DGRAM 是基于UDP的,无保障的面向消息的socket,多用于在网络上发广播信息。 |
proto | 协议号通常为零,可以省略,或者在地址族为AF_CAN的情况下,协议应为CAN_RAW或CAN_BCM之一。 |
fileno |
客户端
import socket sk = socket.socket() sk.connect( ("127.0.0.1",9000) ) # 处理收发数据逻辑 sk.close()
服务端
"""socketserver的提出 , 是为了允许在tcp协议下进行并发操作 ... """ import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): print("handle这个方法被触发了 .... ") # ThreadingTCPServer( ip端口号 , 自定义的类 ) server = socketserver.ThreadingTCPServer( ("127.0.0.1",9000) , MyServer ) # 调用内部相关函数 server.serve_forever()
用类定义
客户端
import socket sk = socket.socket() sk.connect( ("127.0.0.1",9001) ) # 处理收发数据逻辑 while True: sk.send(b'give me five') res = sk.recv(1024) print(res.decode()) sk.close()
服务端
"""socketserver的提出 , 是为了允许在tcp协议下进行并发操作 ... """ import socketserver class MyServer(socketserver.BaseRequestHandler): # 第五步: 处理收发数据的逻辑写在handle中; def handle(self): """ <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9001), raddr=('127.0.0.1', 33778)> ('127.0.0.1', 33778) handle这个方法被触发了 .... print(self.request) # self.request <=> conn print(self.client_address) # self.client_address <=> addr print("handle这个方法被触发了 .... ") """ conn = self.request while True: res = conn.recv(1024) res2 = res.decode() print(res2) conn.send( res2.upper().encode() ) # ThreadingTCPServer( ip端口号 , 自定义的类 ) server = socketserver.ThreadingTCPServer( ("127.0.0.1",9001) , MyServer ) # 调用内部相关函数 server.serve_forever()
服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来
客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
(等价于:异常处理+connect 一旦网络不通,作用:返回错误号而不是直接报错)
公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据,send返回值是发送的[字节数量],这个值可能小于要发送的string字节数
s.sendall() 发送TCP数据,sendall返回值是None,发送string所有数据
'''
# 下面两个代码等价:
#sendall => sock.sendall('Hello world\n')
#send => buffer = 'Hello world\n'
while buffer:
n = sock.send(buffer)
buffer = buffer[n:] (切片)
'''
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
面向锁的套接字方法
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间
面向文件的套接字的函数
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件
更多方法
分类:
python网络并发编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理