Python socket 文件传输
1.基于TCP的文件传输
服务端:
#!/usr/bin/env python # --*-- encoding:utf-8 --*-- import socket sscok = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sscok.bind(('127.0.0.1',9999,)) sscok.listen(10) while True: conn,addr =sscok.accept() recv_size = 0 #接收文件的大小 file_size = str(conn.recv(1024),encoding='utf-8') file_size_int = int(file_size) with open('new.jpg','wb') as f: while True: if recv_size == file_size_int: break data = conn.recv(1024) f.write(data) recv_size += len(data) sscok.close()
客户端:
#!/usr/bin/env python # --*-- encoding:utf-8 --*-- import socket import os import time cscok = socket.socket(socket.AF_INET,socket.SOCK_STREAM) cscok.connect(('127.0.0.1',9999)) #获取文件大小 file_size = os.stat('old.jpg').st_size #发送文件大小 cscok.sendall(bytes(str(file_size),encoding='utf-8')) time.sleep(5) #没有成功,让客户端停留 #发送文件内容 with open('old.jpg','rb') as f: for line in f: cscok.sendall(line) cscok.close()
上述的实验,有可能不成功,会出现粘包的问题,第一次发送的包和第二次发送的包粘在了一起,被缓冲区一起发送过去了
解决方案,在发送包之间进行一次确认交互即可
服务端:
import socket sscok = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sscok.bind(('127.0.0.1',9999,)) sscok.listen(10) while True: conn,addr =sscok.accept() recv_size = 0 file_size = str(conn.recv(1024),encoding='utf-8') file_size_int = int(file_size) #解决粘包,发送确认消息 conn.send(bytes('已经收到文件大小',encoding='utf-8')) with open('new.jpg','wb') as f: while True: if recv_size == file_size_int: break data = conn.recv(1024) f.write(data) recv_size += len(data) sscok.close()
客户端:
import socket import os import time cscok = socket.socket(socket.AF_INET,socket.SOCK_STREAM) cscok.connect(('127.0.0.1',9999)) file_size = os.stat('old.jpg').st_size cscok.sendall(bytes(str(file_size),encoding='utf-8')) #解决粘包,接收确认消息 cscok.recv(1024) with open('old.jpg','rb') as f: for line in f: cscok.sendall(line) cscok.close()

浙公网安备 33010602011771号