关于python的文件传输我们可以利用socket模块来进行通信传输
服务端
import os
import json
import socket
import threading
class ServerIdea:
def server_idae(conn, addr):
while True:
msg = conn.recv(1024).decode('utf-8')
flag = msg.split()
if msg == 'ls':
print(f'{addr[0]}:{addr[1]}\tls')
ServerIdea.s_ls_idea(conn)
elif flag[0] == 'put':
ServerIdea.s_put_idea(conn, addr, flag[1])
elif flag[0] == 'get':
ServerIdea.s_get_idea(conn, addr, flag[1])
def s_ls_idea(conn):
file_list = str(os.listdir(r'.\swap'))
conn.sendall(bytes(str(len(file_list)), 'utf-8').zfill(8))
conn.sendall(file_list.encode('utf-8'))
def s_put_idea(conn, addr, file):
if file in os.listdir('.\\swap\\'):
conn.sendall('1'.encode('utf-8').zfill(1))
return
else:
conn.sendall('0'.encode('utf-8').zfill(1))
header_size = int(conn.recv(4).decode('utf-8'))
header = json.loads(conn.recv(header_size).decode('utf-8'))
print(f'{addr[0]}:{addr[1]}\tput {file}\tsize:{header["Size"]}')
add_size = 0
with open('.\\swap\\' + header['Name'], 'wb')as f1:
while add_size < int(header['Size']):
swap = conn.recv(1024)
add_size += len(swap)
f1.write(swap)
def s_get_idea(conn, addr, file):
if not file in os.listdir('.\\swap\\'):
conn.sendall('1'.encode('utf-8').zfill(1))
return
else:
conn.sendall('0'.encode('utf-8').zfill(1))
header = {
'Name': file,
'Size': os.path.getsize('.\\swap\\' + file)
}
print(f'{addr[0]}:{addr[1]}\tget {file}\tsize:{header["Size"]}')
conn.sendall(bytes(str(len(json.dumps(header))), 'utf-8').zfill(4))
conn.sendall(json.dumps(header).encode('utf-8'))
with open('.\\swap\\' + file, 'rb')as f1:
while True:
swap = f1.read(1024)
if not swap:
break
conn.sendall(swap)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', 4001))
s.listen(5)
while True:
conn, addr = s.accept()
print(addr)
threading.Thread(target = ServerIdea.server_idae, args = (conn, addr, ), daemon = True).start()
客户端
import os
import json
import socket
class ClientIdea:
def c_ls_idea(msg):
c.sendall(msg.encode('utf-8'))
data_size = int(c.recv(8).decode('utf-8'))
add_size = 0
data = b''
while add_size < data_size:
swap = c.recv(1024)
add_size += len(swap)
data += swap
for file in eval(data):
print(file)
def change_file():
print('服务器未连接,请重新输入!')
with open('config.ini', 'w', encoding = 'utf-8')as f1:
f1.write(input('服务器ip:') + ' ')
f1.write(input('服务器端口:'))
def c_put_idea(msg, flag):
if not os.path.exists(flag[1]):
print('本地没有此文件!')
return
c.sendall(str(flag[0] + ' ' + os.path.basename(flag[1])).encode('utf-8'))
if c.recv(1).decode('utf-8') == '1':
print('服务器已有此文件!')
return
header = {
'Name': os.path.basename(flag[1]),
'Size': os.path.getsize(flag[1])
}
c.sendall(bytes(str(len(json.dumps(header))), 'utf-8').zfill(4))
c.sendall(json.dumps(header).encode('utf-8'))
add_size = 0
with open(flag[1], 'rb')as f1:
while True:
swap = f1.read(1024)
if not swap:
break
c.sendall(swap)
add_size += len(swap)
print(f'上传中...\t{int(add_size / header["Size"] * 100)}%\r', end = '')
print('上传成功!')
def c_get_idea(msg, flag):
if os.path.exists(flag[1]):
print('本地已有此文件!')
return
c.sendall(msg.encode('utf-8'))
if c.recv(1).decode('utf-8') == '1':
print('服务器没有此文件!')
return
header_size = int(c.recv(4).decode('utf-8'))
header = json.loads(c.recv(header_size).decode('utf-8'))
add_size = 0
with open(header['Name'], 'wb')as f1:
while add_size < int(header['Size']):
swap = c.recv(1024)
add_size += len(swap)
f1.write(swap)
print(f'下载中...\t{int(add_size / header["Size"] * 100)}%\r', end = '')
print('下载成功!')
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if not 'config.ini' in os.listdir():
ClientIdea.change_file()
while True:
with open('config.ini', 'r', encoding = 'utf-8')as f1:
ip, port = f1.read().split()
try:
if c.connect_ex((ip, int(port))):
ClientIdea.change_file()
else:
break
except:
ClientIdea.change_file()
while True:
msg = input('>').strip()
if not msg:
continue
flag = msg.split()
if len(flag) == 1 and msg == 'ls':
ClientIdea.c_ls_idea(msg)
elif len(flag) == 2 and flag[0] == 'put':
ClientIdea.c_put_idea(msg, flag)
elif len(flag) == 2 and flag[0] == 'get':
ClientIdea.c_get_idea(msg, flag)
以上代码是我用python写的一个关于文件传输的小网盘
服务端用到了多线程来让多个客户端连接进来分开通信,然后定义了一个类,里面写了4个方法server_idae主要是用来接收客户端希望进行的操作,其他的就是对应客户端上传和下载的方法,还有一个ls_idea是用来查看服务器的文件的
客户端也使用了三个方法来对应服务端的方法。
在文件传输的时候通过json模块来发送文件的一些信息比如大小、名称之类的并且可以通过名称来判断文件是否存在。