直接上代码,代码中有一些注释
# 1.首先定义usage函数
# 2.利用getopt模块获取命令行参数
# 3.区分客户端和服务端
# 4.编写客户端和服务器函数
# 5.编写文件上传函数、文件下载函数
import sys
import socket
import getopt
import time
upfile=""
def main():
global upfile # 定义你要上传文件的名字
help=False
listen=False
target=""
port=0
#2.利用getopt模块获取命令行参数
opts,args=getopt.getopt(sys.argv[1:],"t:p:u:hl")
for o,a in opts:
if o=="-t":
target=a
elif o=="-p":
port=int(a)
elif o=="-u":
upfile=a
elif o=="-h":
help=True
elif o=="-l":
listen=True
else:
assert False,"Unhadled Option" # 如果输入的参数不对,则退出程序
if help:
usage() # 如果有-h参数则打印帮助信息
# 3.区分客户端和服务器
if not listen: # 如果没有监听 状态则表示是一个客户端
client_handle(target,port)
else: # 否则则是一个服务端
server_handle(port)
# 4.编写客户端函数和服务端函数
# 编写client_handle()
def client_handle(target,port):
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立socket套接字
client.connect((target,port))
client.send(upfile.encode('utf-8'))
time.sleep(1) # 这里暂停一秒的意思是为了不让文件名和文件的内容接受混乱
upload_file(client)
client.close()
# 编写server_handle
def server_handle(port):
server =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('0.0.0.0',port))
server.listen(10) #监听的个数
print("[*] Listening on 0.0.0.0:%d" % port)
while True:
client_socket,addr=server.accept()
download_file(client_socket)
# 5.编写文件上传函数、文件下载函数
# 定义upload_file
def upload_file(client):
f=open(upfile,'rb')
data =f.read()
f.close()
client.send(data)
# 定义download_file
def download_file(client_socket):
filename=client_socket.recv(1024)
filename=filename.decode()
print("[*]Receive the filename: %s" % filename)
file_buffer="".encode('utf-8')
while True:
data=client_socket.recv(1024)
if not data:
break
else:
file_buffer+=data
f=open(filename,'wb')
f.write(file_buffer)
f.close()
# 1.首先定义usage函数
def usage():
print("@author:BigStrong")
print("-------------------")
print("help info: python3 file_upload.py -h")
print("client :python3 upload.py -t [target] -p [port] -u [uploadfile]")
print("server: python filename.py -lp [port] ")
sys.exit()
if __name__=="__main__":
main()
为了演示我开启了一台Ubuntu虚拟机作为服务端,windows10作为客户端
使用方法:
查看帮助信息: python3 file_upload.py -h
上传文件:
服务端: python3 file_upload.py -lp [监听端口]
客户端: python3 upload -u test.txt -t [服务端ip]
文件传输成功
注意: 如果传输失败的话,尝试换一个端口尝试一下