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