socket
"""服务器端函数"""s.bind() # 绑定(主机ip,端口号)s.listen() # 开始TCP监听s.accpet() # 被动接受TCP客户端的连接"""客户端函数"""s.connect() # 主动初始化TCP服务器连接s.connect_ex() # connect函数的扩展版本,出错时返回出错码,而不抛出异常"""公共用途函数"""s.recv() # 接收TCP数据s.send() # 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)s.sendall() # 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)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() # 创建一个与该套接字相关的文件
TCP
服务端
import socket"""AF_UNIX 文件AF_INET ipv4AF_INET6 ipv6SOCK_STREAM tcp模式SOCK_DGRAM udp模式"""# 创建socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 配置socket,重用ip和端口server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定ip地址server.bind(('127.0.0.1', 8080))# 监听连接server.listen(5)while True:# 等待客户端连接conn, addr = server.accept()while True:try: # 针对windows 客户端端口连接处理# 接收客户端数据data = conn.recv(1024)if not data: # 针对linux 客户端断开连接处理break# 发送数据给客户端conn.send('111')except ConnectionResetError:print('客户端断开连接')break# 关闭客户端连接conn.close()# 关闭服务端连接server.close()
客户端
import socket# 创建scoketclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接服务端client.connect(('127.0.0.1', 8080))while True:cmd = input('>>>').strip()if not cmd:continueclient.send(cmd.encode('utf-8'))res = client.recv(1024)print(res.decode('utf-8'))client.close()
粘包
解决方法:发送数据报头
"""服务端"""1. 定义报头字典2. 将报头json.dumps()序列化,encode()转换成字节3. 得到报头长度4. 将报头长度打包,struct.pack(),'i' 固定长度4bytes5. 发送报头长度6. 发送报头7. 发送数据"""客户端"""1. 接收报头长度,4个字节2. 解包报头长度struct.unpack(),等到报头长度3. 根据报头长度,接收报头4. 将报头decode()转换成字符串,并json.loads()反序列化5. 根据报头中数据长度,接收数据
struct
import struct# 将数据打包struct.pack()# 将数据解包struct.unpack()
socketserver
- 连接相关类
- BaseServer
- TCPServer
- UDPServer
- UnixStreamServer
- UnixDatagramServer
- 多线程相关类
- ThreadingMixIn
- ThreadingTCPServer
- ThreadingUDPServer
- 多进程相关类
- ForkingMixIn
- ForkingTCPServer
- ForkingUDPServer
- 通信相关类:
- BaseRequestHandler
- StreamRequestHandler
- DataGramRequestHandler
import socketserverclass MyServer(socketserver.BaseRequestHandler):def handle(self):# self.request # 客户端连接socket对象passif __name__ == '__main__':obj = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyServer)obj.serve_forever()
UDP
subprocess
import subprocess# 执行命令res = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)# 获取命令执行结果res.stdout.read()# 如果不为空则命令执行错误,错误信息res.stderr.read()
