Python通過Socket實現檔案傳輸
阿新 • • 發佈:2019-02-12
客戶端
# -*- coding: utf-8 -*- import socket import argparse import os import hashlib import pickle def parse_args(): parser = argparse.ArgumentParser() parser.add_argument("-f","--file",help="the file you want to send") parser.add_argument("-i","--ip",help="target's ip address") args = parser.parse_args() filePath = args.file ip = args.ip print "File path : %s" % filePath return filePath,ip def read_file(filePath,eachCount): f = open(filePath,'r') size = os.path.getsize(filePath) * 1024 print "Sent file size:",size data = "" tmp = f.read(eachCount) data += tmp while len(tmp) >0 : tmp = f.read(eachCount) data += tmp f.close() # print data md5_data = hashlib.md5(data).hexdigest() info = { 'size':size, 'md5':md5_data, 'name':os.path.basename(filePath) } return data,info if __name__ == "__main__": filePath,ip = parse_args() d,info = read_file(filePath,1024) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) if not ip : ip = "127.0.0.1" s.connect((ip,9999)) print s.recv(1024) s.sendall("#info#"+pickle.dumps(info)) print s.recv(1024) s.send("#file#"+d) print s.recv(1024) s.send('exit') print s.recv(1024) s.close()
服務端:
# -*- coding: utf-8 -*- import socket import time import argparse import threading import os import hashlib import pickle def tcplink(sock,addr): print "Now accept new connection from %s:%s..." %addr sock.send("ok") while True: data = sock.recv(2048) if data == "exit" or not data: break if data.startswith("#info#"): str_info = data[6:] info = pickle.loads(str_info) print info sock.send("ok") size = info['size'] d = sock.recv(4096) print "Rec:",d if d.startswith("#file#"): if len(d) >= 4096: d = d[6:] write_file(info['name'],d) while size >0 : if size >= 4096: print size d = sock.recv(4096) write_file(info['name'],d) size -= 4096 else: print "end",size d = sock.recv(size) size = 0 write_file(info['name'],d) else: write_file(info['name'],d[6:]) sock.send("ok") sock.send("bye") sock.close() print "Now disconnect socket from %s:%s..." %addr def write_file(name,data): f = open("recv/%s"%name,"a+") f.write(data) print "recv/%s"%name f.close() if __name__ == "__main__": s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind(("127.0.0.1",9999)) s.listen(5) print "Waiting for connection..." while True: sock,addr = s.accept() t=threading.Thread(target=tcplink(sock,addr))
Usage:
python rec.py
python send.py -f '{file path}' -i '{ip address}'