天天看點

利用tcp協定實作大檔案傳輸(socket)

server.py

import socket
import json
import struct

sk = socket.socket()
sk.bind(('127.0.0.1', 2000))
sk.listen()

conn, addr = sk.accept()
msg_len = conn.recv(4)
dic_len = struct.unpack("i", msg_len)[0]  # 防止粘包
msg = conn.recv(dic_len).decode("utf-8")
msg = json.loads(msg)

with open(msg['filename'], 'wb') as f:
    while msg['filesize'] > 0:
        content = conn.recv(1024)
        msg['filesize'] -= len(content)  # tcp協定将1024位元組分開發送
        f.write(content)

conn.close()
sk.close()
           

client.py

import os
import json
import struct
import socket

sk = socket.socket()
sk.connect(('127.0.0.1', 2000))

# 檔案名\檔案大小
abs_path = r'F:\個人文檔\計算病理及其數字化切片組織形态學定量分析.docx'
filename = os.path.basename(abs_path)
filesize = os.path.getsize(abs_path)

dic = {'filename': filename, 'filesize': filesize}
str_dic = json.dumps(dic)
b_dic = str_dic.encode("utf-8")
mlen = struct.pack('i', len(b_dic))
sk.send(mlen)
sk.send(b_dic)

with open(abs_path, mode='rb') as f:
    while filesize > 0:
        content = f.read(1024)
        filesize -= 1024
        sk.send(content)
sk.close()
           

先運作server,py、後client.py