📜  使用Python 的文件共享应用程序(1)

📅  最后修改于: 2023-12-03 15:36:36.209000             🧑  作者: Mango

使用Python的文件共享应用程序

简介

文件共享应用程序可以帮助用户在多台计算机之间共享文件。使用Python编写文件共享应用程序可以非常方便地实现这一目的。Python凭借其易于学习的特点、丰富的库以及不错的性能,在文件共享应用程序开发中得到了广泛的应用。

实现思路

文件共享应用程序可以通过以下步骤实现:

  1. 创建一个服务器程序,监听指定的端口。
  2. 接受客户端的连接请求。
  3. 接收客户端发送的文件,并将其保存到指定的目录下。
  4. 从指定目录中读取文件,并将其发送给客户端。

这些步骤可以分别使用Python的socket、os以及struct等库来实现。

实现过程

以下是一个简单的文件共享应用程序的实现示例。该示例包含一个服务器程序和一个客户端程序。服务器程序可以接收客户端的连接请求,并接收客户端发送的文件。客户端程序可以连接到服务器,并向服务器发送指定的文件。

服务器程序
import os
import socket
import struct

HOST = '127.0.0.1'
PORT = 8000
BUF_SIZE = 1024

def recv_file(conn, file_path):
    try:
        with open(file_path, 'wb') as f:
            while True:
                data = conn.recv(BUF_SIZE)
                if not data:
                    break
                f.write(data)
    except Exception as e:
        print('Error:', e)

def send_file(conn, file_path):
    try:
        with open(file_path, 'rb') as f:
            while True:
                data = f.read(BUF_SIZE)
                if not data:
                    break
                conn.send(data)
    except Exception as e:
        print('Error:', e)

def main():
    # 创建监听套接字
    server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_sock.bind((HOST, PORT))
    server_sock.listen(1)

    while True:
        print('Waiting for connection...')
        # 接受客户端连接请求
        conn, addr = server_sock.accept()
        print('Connected by', addr)

        # 接收客户端发送的文件
        file_name = conn.recv(BUF_SIZE).decode()
        recv_file(conn, os.path.join('server_files', file_name))
        print('File received:', file_name)

        # 发送指定的文件给客户端
        file_path = 'server_files/File.txt'
        file_size = os.path.getsize(file_path)
        conn.send(struct.pack('!Q', file_size))
        send_file(conn, file_path)
        print('File sent:', file_path)

        # 关闭连接
        conn.close()

    server_sock.close()

if __name__ == '__main__':
    main()
客户端程序
import os
import socket
import struct

HOST = '127.0.0.1'
PORT = 8000
BUF_SIZE = 1024

def recv_file(conn, file_path):
    try:
        with open(file_path, 'wb') as f:
            while True:
                data = conn.recv(BUF_SIZE)
                if not data:
                    break
                f.write(data)
    except Exception as e:
        print('Error:', e)

def send_file(conn, file_path):
    try:
        with open(file_path, 'rb') as f:
            while True:
                data = f.read(BUF_SIZE)
                if not data:
                    break
                conn.send(data)
    except Exception as e:
        print('Error:', e)

def main():
    # 连接服务器
    client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_sock.connect((HOST, PORT))

    # 发送指定的文件给服务器
    file_path = 'client_files/File.txt'
    file_name = os.path.basename(file_path)
    client_sock.send(file_name.encode())
    send_file(client_sock, file_path)
    print('File sent:', file_path)

    # 接收从服务器发送的文件
    data = client_sock.recv(8)
    file_size = struct.unpack('!Q', data)[0]
    recv_file(client_sock, 'client_files/File_from_server.txt')
    print('File received from server')

    # 关闭连接
    client_sock.close()

if __name__ == '__main__':
    main()
总结

该文件共享应用程序示例基于Python的socket、os以及struct等库实现,实现了一个简单的文件共享功能。该示例可以帮助程序员了解如何使用Python实现文件共享应用程序,也可以作为类似应用程序开发的参考。