欢迎访问宙启技术站
智能推送

使用Python编写一个简单的文件分享程序

发布时间:2023-12-04 12:34:51

文件分享是一种常见的需求,可以方便地在不同设备之间共享文件。下面是一个使用Python编写的简单文件分享程序的例子。

首先,我们需要导入一些必要的模块。在这个例子中,我们将使用socket模块来实现网络通信,以及os模块来处理文件操作。

import socket
import os

接下来,我们定义一些常量来设置网络连接的端口号和文件保存的位置。

PORT = 12345  # 网络连接的端口号
SAVE_DIR = 'shared_files/'  # 文件保存的位置

然后,我们定义一些函数来处理文件分享的各个环节。

1. send_file函数用来发送文件给对方。

def send_file(conn, filename):
    try:
        with open(filename, 'rb') as file:
            data = file.read()
            conn.sendall(data)
            print('文件发送成功')
    except FileNotFoundError:
        print('文件不存在')

2. recv_file函数用来接收对方发送的文件。

def recv_file(conn, filename):
    try:
        with open(filename, 'wb') as file:
            data = conn.recv(1024)
            while data:
                file.write(data)
                data = conn.recv(1024)
            print('文件接收成功')
    except FileNotFoundError:
        print('文件保存路径不存在')

3. list_files函数用来列出文件分享目录中的所有文件。

def list_files():
    files = os.listdir(SAVE_DIR)
    for file in files:
        print(file)

4. handle_client函数用来处理客户端的连接请求。

def handle_client(conn):
    conn.sendall(b'Hello, welcome to file sharing!')
    while True:
        data = conn.recv(1024).decode()
        if data == 'list':
            list_files()
        elif data.startswith('send'):
            _, filename = data.split(' ')
            send_file(conn, SAVE_DIR + filename)
        elif data.startswith('recv'):
            _, filename = data.split(' ')
            recv_file(conn, SAVE_DIR + filename)
        elif data == 'quit':
            break

最后,我们创建一个服务端来监听客户端的连接。

def start_server():
    print('服务器已启动,等待连接...')
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
        server_socket.bind(('0.0.0.0', PORT))
        server_socket.listen(5)
        while True:
            conn, addr = server_socket.accept()
            print('已连接:', addr)
            handle_client(conn)
            conn.close()
            print('连接已关闭')

使用例子:

1. 启动服务端,等待连接。

start_server()

2. 启动客户端,连接到服务端。

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client_socket:
    client_socket.connect(('localhost', PORT))
    message = client_socket.recv(1024)
    print(message.decode())

3. 发送文件给服务端。

client_socket.sendall(b'send example.txt')

4. 从服务端接收文件。

client_socket.sendall(b'recv example.txt')

5. 列出服务端文件分享目录中的文件。

client_socket.sendall(b'list')

6. 断开连接。

client_socket.sendall(b'quit')

通过这个例子,我们可以看到如何使用Python编写一个简单的文件分享程序。在实际使用中,我们可以根据需求对程序进行修改和扩展。