准备工作,实现文件上传需要那些工具呢?
socket(传输)、open()(打开文件)、os(读取文件信息),当然还有辅助类sys和json,下面我们开始吧
import socket,sys
import json,os #创建socket对象
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #获取本地主机名
host = socket.gethostname() #设置端口号
port = 9000 #绑定端口
server.bind((host,port)) #设置最大连接数
server.listen(5) #建立连接
while True:
print('开始监听')
#建立客户端连接
clint,addr = server.accept()
print("连接地址: %s" % str(addr))
#接收文件属性数据,创建文件
jsonObj = json.loads(clint.recv(1024).decode('utf-8'))
print('接收到数据',jsonObj)
if not jsonObj :
os.mknod(jsonObj['name'])
msg = json.dumps({'name':'消息','信号':'创建成功'})
#回数据确认已经建立新文件
clint.send(msg.encode('utf-8'))
#接收数据
size = 0
sizeValue = int(jsonObj['size'])
print('开始接收数据')
with open(jsonObj['name'], 'wb') as file:
while size < sizeValue:
value = sizeValue - size
if value >1024:
getdate = clint.recv(1024)
else :
getdate = clint.recv(value)
file.write(getdate)
size += 1024
print('结束')
#关闭连接
clint.close()
客户端
'''发送文件
Usage:
clint.py <name> [<rename>] '''
import socket
import os,json,sys #建立json数据,包含文件名以及大小
#{name:name,size:99999}
date = {}
if len(sys.argv) == 2:
print(type(sys.argv[1]))
name = sys.argv[1].split('\\')[-1]
date['name'] = name
else:
date['name'] = sys.argv[2]
date['size'] = os.path.getsize(sys.argv[1])
jsonString = json.dumps(date).encode('utf-8') #create connection
clint = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口好
port = 9000
# 连接服务,指定主机和端口
clint.connect((host, port))
#发送文件属性信息
clint.send(jsonString)
#接收服务端发过来的确认信息
clint.recv(1024)
#发送文件数据
size = 0
with open(sys.argv[1],'rb') as file:
while size < date['size']:
fileDate = file.read(1024)
clint.send(fileDate)
size += 1024
#关闭连接
clint.close()