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

使用PythonSocketServer实现文件传输服务器

发布时间:2023-12-25 04:16:04

Python的SocketServer模块提供了一种方便的方式来实现网络服务器。我们可以使用它来实现一个简单的文件传输服务器,以下是一个实现文件传输服务器的示例代码:

import SocketServer

class FileTransferHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        # 接收文件名
        file_name = self.request.recv(1024).strip()
        print("Received file:", file_name)

        # 打开文件并发送数据
        try:
            with open(file_name, 'rb') as file:
                data = file.read()
                self.request.sendall(data)
            print("File sent successfully")
        except IOError:
            print("File not found")

class FileTransferServer(SocketServer.TCPServer):
    allow_reuse_address = True

if __name__ == "__main__":
    # 创建服务器对象并指定监听的地址和端口
    server = FileTransferServer(('localhost', 8000), FileTransferHandler)
    print("Server started...")
    # 开始监听客户端请求
    server.serve_forever()

在这个示例中,我们定义了一个FileTransferHandler类,它继承自SocketServer.BaseRequestHandler类。这个类会处理客户端的连接请求,并实现了handle方法来处理文件传输过程。

handle方法中,我们首先接收客户端发送过来的文件名,然后尝试打开这个文件并读取数据。如果文件存在,就把文件数据发送给客户端;如果文件不存在,就打印一个错误消息。

另外,我们还定义了一个FileTransferServer类,它继承自SocketServer.TCPServer类。这个类用来创建服务器对象,并指定监听的地址和端口。我们还设置了allow_reuse_address属性为True,允许服务端断开连接后立即重新使用地址。

if __name__ == "__main__":块中,我们创建了一个FileTransferServer的实例,并指定了监听的地址(本地主机)和端口号(8000)。然后,开始监听客户端请求,直到程序被停止。

要演示这个服务器的使用,我们可以在另一个Python脚本或命令行中使用socket库来实现客户端。以下是一个简单的客户端代码示例:

import socket

def send_file(file_name):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(('localhost', 8000))
    sock.sendall(file_name)
    data = sock.recv(1024)
    with open('received_file', 'wb') as file:
        file.write(data)
    sock.close()
    print("File received")

if __name__ == "__main__":
    send_file("file_to_send.txt")

在这个示例中,我们定义了一个名为send_file的函数,它会连接到服务器,并发送文件名。然后,它会接收服务器发送的数据,并将其写入一个名为received_file的文件中。

if __name__ == "__main__":块中,我们调用send_file函数,并传递要发送的文件名(file_to_send.txt)。

要测试这个文件传输服务器,可以先运行服务器脚本,然后再运行客户端脚本。客户端将会发送文件名给服务器,服务器会尝试打开文件并发送数据给客户端。客户端接收数据后会将其保存为一个新文件。整个文件传输过程在控制台中输出相应的消息。