目录
一:代码
server.py 服务端
import json
import socket
import struct
sk = socket.socket() # 实例化socket
sk.bind(('10.76.31.75', 8080)) # 绑定ip与port
sk.listen() # 监听
conn, addr = sk.accept() # 等待接受链接
print('from client ', addr) # 打印客户端的ip与port
head_struct = conn.recv(4) # 接受4字节、确定要传输的文件大小
# if not head_struct: break
head_len = struct.unpack('i', head_struct)[0] # 解码、得到报文头部的长度
head_json = conn.recv(head_len).decode('utf-8') # 接受报文头部并解码
head_dic = json.loads(head_json) # 将字节码转换为json
print(head_dic) # 打印出报文头
recv_size = 0
file_name = head_dic['filename']
filesize = head_dic['filesize']
cmd = head_dic['operate']
if cmd == 'upload': # 判断是否为上传操作
# conn.send(b'received!') # 若为上传、回复received!消息
with open(file_name, 'wb') as f: # 键接受到的数据写入文件
while True:
if recv_size < filesize: # 如果filesize 不等于0
recv_data = conn.recv(1024)
f.write(recv_data)
recv_size += len(recv_data)
print('recvsize:%s filesize:%s' % (recv_size, filesize))
else:
recv_data = conn.recv(1024)
f.write(recv_data)
break
elif cmd == 'download':
print("下载请求..............")
else:
print('非法操作.........')
conn.close()
sk.close()
client.py 客户端
import os
import json
import struct
import socket
sk = socket.socket() # 创建socket类
sk.connect(('10.76.31.75', 8080)) # 绑定ip与端口
def get_filename(file_path):
filename = os.path.basename(file_path)
return filename
# 选择 操作
operate = ['upload', 'download'] # 上传或下载
for num,opt in enumerate(operate, 1):
print(num,opt)
num = int(input('请输入您要做的操作序号 : '))
if num == 1:
'''上传操作'''
file_path = input('请输入要上传的文件路径 : ')
# 告诉对方要上传的文件的名字
file_name = get_filename(file_path)
filesize = os.path.getsize(file_path) # 文件的字节大小
head_dic = {'operate': 'upload', 'filename': file_name, 'filesize': filesize}
print(head_dic)
head_json = json.dumps(head_dic) # jsom转字符串
head_json_bytes = bytes(head_json, encoding='utf-8') # 字符串转字节
head_struct = struct.pack('i', len(head_json_bytes)) # 报文头长度编码为4字节长度
sk.send(head_struct) # 发送报文头头部长度
sk.send(head_json_bytes) # 发送报文头内容(字节)
send_size = 0 # 初始化已发送字节大小
with open(file_path, 'rb') as f: # 用于读取文件
content = f.read()
sk.send(content)
elif num == 2:
'''下载操作'''
print("暂不支持下载操作")
sk.close()
# 文本文件 D:\my_upload\my_file.txt
# 视频文件 D:\my_upload\Wildlife.wmv
二:运行方式
1、启动server.py服务端程序
2、启动客户端
3、按照提示键入命令
注:要输入自己电脑上、指向向传输的文件绝对路径、我输入的是我电脑上的一个视频文件。
4、文件夹传输成功
说明;
1、本例是用环回口在一台机器上传输的。可以修改ip和port实现两台机器出阿叔文件。
2、文件下载与上传实现方法类似、未实现。