网络编程大文件传输
实现大文件传输
就是说服务端给客户端发数据之前,先计算一下给客户端要发多少数据,我先判断 len 一下,就 ok 了,先让客户端知道服务端发送过来的大小,比如说发过来的是5k大小,客户端接收到了这个5k大小以后,就知道需要接收多少次了,循环接收,直到5k数据全部接收完毕为止
客户端代码:和服务端
这个里面有中文字节的坑,可以看到有中文的len前后就不一样, 中文字符=3个字节
import socket client = socket.socket() client.connect(("localhost", 9999)) while True: cmd = input(">>>:").strip() if len(cmd) == 0: continue client.send(cmd.encode("utf-8")) cmd_res_size = client.recv(1024) # 接收命令的长度 print("命令结果大小:", cmd_res_size.decode()) recevied_size = 0 # 接收客户端发来数据的计算器 recevied_data = b'' # 客户端每次发来内容的计数器 while recevied_size < int(cmd_res_size.decode()): # 当接收的数据大小 小于 客户端发来的数据 cmd_res = client.recv(1024) recevied_size += len(cmd_res) # 每次收到的服务端的数据有可能小于1024,所以必须用len判断 recevied_data += cmd_res else: print(recevied_data.decode("utf-8", "ignore")) print("cmd res receive done ....", recevied_size)
import socket, os server = socket.socket() server.bind(("localhost", 9999)) server.listen(5) while True: conn, addr = server.accept() print("new addr:", addr) print('conn',conn) while True: data = conn.recv(1024) if not data: print("客户端已断开") break print("执行指令:", data) cmd_res = os.popen(data.decode()).read() print("before send:", len(cmd_res)) if len(cmd_res) == 0: cmd_res = "cmd has no output...." conn.send(str(len(cmd_res.encode())).encode()) # 发送服务端发送给客户端数据的长度 conn.send(cmd_res.encode("utf-8")) # 发送服务端的数据 print("send done")