server.py
import socket
import pickle
import struct
# 不传参数,默认使用基于网络类型的套接字,协议:TCP
server = socket.socket()
# 告诉别人server的地址和端口
# 端口的范围是0-65535,但是0-1023这些是默认端口不能使用
server.bind(('192.168.1.107', 18080))
# 能同时接受的连接
server.listen()
# 接受客户端的连接,阻塞等待
conn, addr = server.accept()
b_len_dic = conn.recv(4)
# 获取int类型字典的长度,unpack结果是一个元组
len_dic = struct.unpack('i', b_len_dic)[0]
pic_dic = conn.recv(len_dic)
dic = pickle.loads(pic_dic)
print(dic)
filename = '1' + dic['filename']
with open(filename, 'wb') as f:
content = conn.recv(1024)
f.write(content)
dic['filesize'] -= len(content)
conn.close()
server.close()
client.py
import socket
import os
import pickle
import struct
client = socket.socket()
client.connect(('192.168.1.107', 18080))
filename = '1__init__'
filesize = os.path.getsize(filename)
dic = {'filename': filename, 'filesize': filesize}
pic_dic = pickle.dumps(dic)
len_dic = len(pic_dic)
# bytes类型字典的长度,防止沾包
b_len_dic = struct.pack('i', len_dic)
# 将bytes类型的字典长度和字典一起发送
client.send(b_len_dic + pic_dic)
with open(filename, 'rb') as f:
while filesize:
content = f.read(1024)
client.send(content)
filesize -= len(content)
client.close()