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

Python中Client()模块实现文件传输的方法和技巧

发布时间:2024-01-16 18:31:11

在Python中,可以使用socket模块来创建一个客户端程序,用于实现文件传输。下面是一个使用socket模块实现文件传输的示例代码:

import socket

def send_file(file_path, host, port):
    # 创建socket对象
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:
        # 连接服务器
        client_socket.connect((host, port))

        # 打开文件
        file = open(file_path, 'rb')

        # 发送文件名和文件大小
        file_name = file_path.split('/')[-1]
        file_size = len(file.read())
        client_socket.send(file_name.encode())
        client_socket.send(str(file_size).encode())

        # 重置文件指针
        file.seek(0)

        # 发送文件内容
        client_socket.sendall(file.read())

        print('文件传输完成')

    except Exception as e:
        print('文件传输失败:', str(e))

    finally:
        # 关闭文件和socket连接
        if file:
            file.close()

        client_socket.close()

if __name__ == '__main__':
    file_path = 'path_to_file'
    host = '127.0.0.1'
    port = 12345

    send_file(file_path, host, port)

上述代码中,send_file函数通过创建一个socket对象,然后使用socket.connect方法连接到服务器。接着,程序读取文件的内容,并发送文件名和文件大小给服务器。然后,通过socket.sendall方法发送文件内容。最后,关闭文件和socket连接。

为了接收文件,你可以在服务器端编写一个相应的receive_file函数。receive_file函数使用socket.accept方法等待客户端连接,然后读取发送的文件名和文件大小,并创建一个文件来接收客户端发送的文件内容。

以下是一个使用socket模块实现文件接收的示例代码:

import socket

def receive_file(save_path, host, port):
    # 创建socket对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((host, port))
    server_socket.listen(1)

    print('等待客户端连接...')
    client_socket, addr = server_socket.accept()
    print('已连接:', addr)

    try:
        # 读取文件名和文件大小
        file_name = client_socket.recv(1024).decode()
        file_size = int(client_socket.recv(1024).decode())

        # 创建文件
        file = open(save_path + '/' + file_name, 'wb')

        # 接收文件内容
        received_size = 0
        while received_size < file_size:
            data = client_socket.recv(1024)
            file.write(data)
            received_size += len(data)

        print('文件接收完成')

    except Exception as e:
        print('文件接收失败:', str(e))

    finally:
        # 关闭文件和socket连接
        if file:
            file.close()

        client_socket.close()
        server_socket.close()

if __name__ == '__main__':
    save_path = 'path_to_save_file'
    host = '127.0.0.1'
    port = 12345

    receive_file(save_path, host, port)

上述代码中,receive_file函数首先创建一个socket对象,并使用socket.bind方法绑定IP和端口。接着,使用socket.listen(1)方法监听来自客户端的连接请求。一旦客户端连接上来,使用socket.accept方法接受连接,并返回客户端socket对象和地址。然后,程序通过socket.recv方法接收文件名和文件大小,并创建一个文件来接收客户端发送的文件内容。

最后,关闭文件和socket连接。

通过上述的代码,你可以实现在客户端和服务器之间高效地传输文件。可以根据实际需求进行调整,例如加入文件校验、进度显示等功能。