基础版非对象版,比较low可以了解其工作原理
服务端
import socket
import json
import struct
import os
share_dir = r'C:/server/share'
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)
soc.bind(('127.0.0.1', 8080))
soc.listen(5)
while True:
conn, adder = soc.accept()
print('客户端连接:', adder)
while True:
try:
res = conn.recv(1024)
print('用户指令:', res)
if not res:
break
cmd = res.decode('utf-8').split()
file_name = cmd[1]
file_path = '%s/%s' % (share_dir, cmd[1])
print(file_name)
'''【把客户端要下载的文件,以读的方式打开,读文件内容发送给客户端】'''
header_dict = {
'file_name': file_name,
'file_size': os.path.getsize(file_path)
}
header_json = json.dumps(header_dict)
header_byte = header_json.encode('GBK')
conn.send(struct.pack('i',len(header_byte)))
conn.send(header_byte)
with open(file_path, 'rb') as f:
for line in f:
conn.send(line)
except ConnectionResetError:
print('断开连接')
break
conn.close()
soc.close()
客户端
import socket
import struct
import json
download_dir = r'C:/client/download'
soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
soc.connect(('127.0.0.1', 8080))
while True:
cmd = input('>>>').strip()
if not cmd:
continue
soc.send(cmd.encode('utf-8'))
'''接收文件的内容,以写的方式打开一个新文件并写入来实现下载功能'''
header_size = struct.unpack('i',soc.recv(4))[0]
header_dict = json.loads(soc.recv(header_size).decode('GBK'))
total_size = header_dict.get('file_size')
file_path = '%s/%s' % (download_dir, header_dict.get('file_name'))
print(file_path)
with open(file_path,'wb') as f:
recv_size = 0
while recv_size < total_size:
lene = soc.recv(1024)
f.write(lene)
recv_size += len(lene)
print('总大小:%s 已下载大小:%s' % (total_size, recv_size))
soc.close()