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

使用Python实现FTP客户端和服务器的函数

发布时间:2023-12-04 07:41:36

FTP(File Transfer Protocol)是一种用于在计算机网络上进行文件传输的协议。FTP客户端与服务器通过TCP/IP协议进行通信。在Python中,可以使用ftplib模块来实现FTP客户端和服务器的功能。

以下是一个简单的FTP客户端实现的示例代码:

from ftplib import FTP

def ftp_client(server, username, password, filename):
    ftp = FTP(server)
    ftp.login(username, password)
    ftp.cwd('')  # 切换到根目录
    with open(filename, 'rb') as file:
        ftp.storbinary('STOR ' + filename, file)  # 上传文件
    ftp.quit()

# 使用示例
ftp_client('ftp.example.com', 'username', 'password', 'example.txt')

上述代码定义了一个ftp_client函数,接受FTP服务器地址、用户名、密码和文件名作为参数。函数内部使用ftplib.FTP类创建一个FTP对象,并调用login方法登录FTP服务器。然后,切换到根目录(使用cwd方法),并打开要传输的文件(使用open函数)。最后,使用storbinary方法将文件上传到服务器,并调用quit方法关闭FTP连接。

以下是一个简单的FTP服务器实现的示例代码:

from ftplib import FTP

def ftp_server(username, password, port=21, root='.'):
    ftp = FTP()
    ftp.set_debuglevel(2)  # 设置调试级别
    ftp.set_pasv(False)  # 关闭被动模式
    ftp.bind(("0.0.0.0", port))  # 绑定监听地址和端口
    ftp.login(username, password)  # 登录
    ftp.cwd(root)  # 设置根目录

    def handle_connection(conn, addr):
        print("New connection from:", addr)
        conn.send("220 Welcome to FTP server\r
".encode())

        while True:
            cmd = conn.recv(1024).decode().strip().split(" ")
            if not cmd:
                break
            
            if cmd[0].upper() == "USER":
                conn.send("331 Please specify the password.\r
".encode())
            elif cmd[0].upper() == "PASS":
                conn.send("230 Login successful.\r
".encode())
            elif cmd[0].upper() == "PWD":
                conn.send("257 \"{0}\" is current directory.\r
".format(ftp.pwd()).encode())
            elif cmd[0].upper() == "CWD":
                ftp.cwd(cmd[1])
                conn.send("250 Directory successfully changed.\r
".encode())
            elif cmd[0].upper() == "LIST":
                conn.send("150 Here comes the directory listing.\r
".encode())
                data_conn, addr = ftp.transfercmd("LIST")
                data = data_conn.recv(1024)
                print(data.decode())
                conn.send("226 Directory send OK.\r
".encode())
                data_conn.close()
            elif cmd[0].upper() == "QUIT":
                conn.send("221 Goodbye.\r
".encode())
                break
            else:
                conn.send("500 Unrecognized command.\r
".encode())

        conn.close()

    ftp.listen(5)  # 监听连接
    while True:
        conn, addr = ftp.accept()  # 接受连接
        handle_connection(conn, addr)  # 处理连接

# 使用示例
ftp_server('username', 'password')

上述代码定义了一个ftp_server函数,接受用户名、密码、端口号和根目录作为参数。函数内部使用ftplib.FTP类创建一个FTP对象,并设置调试级别、关闭被动模式、绑定监听地址和端口、登录FTP服务器、设置根目录。然后,定义一个handle_connection函数,用于处理每个客户端连接。在handle_connection函数中,根据客户端发送的命令,采取相应的操作(如登录、修改目录、列出目录等),并发送对应的响应消息。

以上是使用Python实现FTP客户端和服务器的函数及使用示例。通过这些示例代码,我们可以根据需要定制自己的FTP客户端和服务器,并进行文件传输和管理。当然,这只是一个简单的实现,实际情况中可能需要考虑更多的安全性和性能问题,请根据实际需求进行相应的改进和优化。