实现 Python 局域网发送文件

引言

在实际工作中,局域网之间发送文件是一项常见的任务,尤其对于开发人员来说,需要将代码或者文件快速传输给同事或者测试机器,因此学会如何在局域网中发送文件是一项非常实用的技能。本文将教会你如何通过 Python 实现局域网发送文件的功能。

整体流程

下面是整体的发送文件流程,可以用表格展示:

步骤 描述
1 创建服务器端接收文件
2 创建客户端发送文件
3 连接服务器和客户端
4 发送文件

实现步骤

步骤1:创建服务器端接收文件

首先,我们需要创建一个服务器端来接收文件。下面是代码示例:

# 导入 socket 模块
import socket

# 创建 socket 对象
server_socket = socket.socket()

# 获取本地主机名
host = socket.gethostname()

# 设置端口号
port = 12345

# 绑定端口号
server_socket.bind((host, port))

# 开始监听
server_socket.listen(5)

print("等待客户端连接...")

上面的代码中,我们通过创建一个 socket 对象,并指定了端口号来创建服务器端,并且开始监听是否有客户端连接。

步骤2:创建客户端发送文件

接下来,我们需要创建一个客户端来发送文件给服务器端。下面是代码示例:

# 创建 socket 对象
client_socket = socket.socket()

# 获取服务器端的主机名
host = socket.gethostname()

# 设置端口号
port = 12345

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

# 打开文件
file = open('example.txt', 'rb')

# 读取文件内容
data = file.read(1024)

# 发送文件内容
while data:
    client_socket.send(data)
    data = file.read(1024)

# 关闭文件
file.close()

在上面的代码中,我们创建了一个客户端 socket 对象,并连接到服务器端,然后打开文件,逐步读取文件内容并发送给服务器端。

步骤3:连接服务器和客户端

接下来,我们需要让服务器端和客户端进行连接。在服务器端代码中加入以下代码:

# 接受客户端连接
client_socket, addr = server_socket.accept()

print("连接地址: ", addr)

这样就实现了服务器端和客户端的连接。

步骤4:发送文件

最后,我们可以在服务器端接收文件内容并保存。在服务器端代码中添加以下代码:

# 打开(或创建)一个文件
file = open('received_file.txt', 'wb')

# 接收文件内容
data = client_socket.recv(1024)

while data:
    file.write(data)
    data = client_socket.recv(1024)

# 关闭文件
file.close()

这样,服务器端就可以接收到客户端发送的文件并保存在本地。

类图

classDiagram
    class Server {
        - server_socket: socket
        - host: str
        - port: int
        + start_listening()
    }

    class Client {
        - client_socket: socket
        - host: str
        - port: int
        + connect_to_server()
        + send_file()
    }

    class File {
        - file_name: str
        - data: bytes
        + open_file()
        + read_data()
        + write_data()
        + close_file()
    }

    Server --> Client
    Client --> File

通过上述类图,展示了服务器端、客户端和文件三者之间的关系。

结语

通过本文的介绍,你学会了如何通过 Python 在局域网中发送文件。这对于实际工作中的文件传输会非常有帮助。希望本文能够帮助到你,加深对 Python 网络编程的理解。如果有任何疑问,欢迎随时联系我。