Python实现文件上传下载

环境准备:

  1. 实验分两个文件,服务端(linux)和客户端(windows).
    服务端运行环境:python2.x
    客户端运行环境:python3.x
  2. 使用了库socket和os

客户端代码:

import socket                    # 调用socket库

HOST = "192.168.43.198"          # 定义服务器ip
PORT = 5555                      # 定义端口号
addr = (HOST,PORT)               # 由于使用socket进行连接,需要把ip和端口先转换为元组
c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)     # 设定了网络连接方式,以及传输使用的协议
c.connect(addr) #连接服务器  

def send_file():
	data = c.recv(1024)                       # 设定接受数据大小
	print(str(data,encoding='gbk'))           # 打印出来,看起来直观,测试用,可以去除
	filepath = input("请输入文件名和路径:")      # 输入要从上传的文件
	with open(filepath,"rb") as f:            # 以只读方式打开指定的文件
		file = f.read()                  # 以byte 的方式读取文件内容
		datas = c.sendall(file)                      # 发送文件内容

def get_file():
	filepath = input("请输入服务器文件路径:")   # 输入要从服务器下载的文件
	c.send(bytes(filepath,encoding='gbk'))   # 向服务器发送我们要下载的信息
	data = c.recv(20480)                     # 指定接受数据大小
	with open("shadow.txt","wb") as f:       # 打开本地文件,将接受到的数据写入本地指定的目录
		f.write(data)


def main():
	while True:
		cmd = input("请输入命令:")                 # 获取用户输入的命令
		c.send(bytes(cmd,encoding='gbk'))        # 发送用户输入的命令
		if cmd == "bye":                         # 如果用户输入bye结束程序
			break
		if cmd == "upload":                      # 如果用户输入upload,调用send_file()函数,进行文件上传
			send_file()
		if cmd == "down":                        # 如果用户输入down,调用get_file()函数,进行文件下载
			get_file()
		data = c.recv(20480)                     # 设置接受数据大小
		print(str(data,encoding='gbk'))          # 将接受的数据打印出来,没多大用
	# ~ c.send(b'word')  #发送字符串前面加b转换bytes比特格式	    
	c.close()


if __name__  == "__main__":                      # 调用main()函数
	main()


服务端代码:

#!/usr/bin/env python
#-*- utf8 -*-  
import socket           # 调用socket库
import os               # 调用os库

HOST = "192.168.43.198"          # 定义服务器ip
PORT = 5555                      # 定义端口号
addr = (HOST,PORT)               # 由于使用socket进行连接,需要把ip和端口先转换为元组
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)      # 设定了网络连接方式,以及传输使用的协议
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(addr)                                              
s.listen(1)
conn,addr = s.accept()

def get_file():
    conn.send("please sendfile:")         # 向客户端发送提示信息
    while True:
        data = conn.recv(1024)            # 设置接受数据大小
        with open("/root/Desktop/up_load/data.txt","ab") as f:    # 向指定的目录写入客户端发送过来的信息
            f.write(data)
        if not data:
            break
    conn.close()                             # 关闭连接

def send_file():
    filepath = conn.recv(1024)                 # 设置接受数据大小,接受客户端发送来的文件路径
    with open(filepath,'rb') as f:             # 读取客户端指定的文件
        data = f.read()                        
    conn.sendall(data)                        # 向客户端发送客户端指定的文件内容
    conn.close()                              # 关闭连接

def main():
    while True:
        cmd = conn.recv(1024)             # 接收客户端发送来的数据
        if cmd == "bye":                  # 如果客户端发送过来的是bye,结束程序
            break
        if cmd == "upload":               # 如果客户端发送过来的是upload,调用函数get_file(),结束程序
            get_file()
            break
        if cmd == "down":                 # 如果客户端发送过来的是down,调用函数send_file(),结束程序
            send_file()
            break
        data = os.popen(cmd)              # popen()可以执行shell命令,并读取此命令返回值
        sdata = data.read()               # 将得到的内容通过read()转换后给了sdata
        if sdata:
            conn.sendall(sdata)           # 将得到的内容全部发送给客户端
        else:
            conn.send("finish")           # 如果客户端发送过来的是其他没有的指令,向客户端返回finish,防止程序假死
    conn.close()                          # 关闭连接
    s.close()

if __name__ == "__main__":
    main()