MST

星途 面试题库

面试题:Python中SocketServer模块构建服务器之基础

在Python使用SocketServer模块构建服务器时,简述TCPServer和UDPServer的主要区别,并说明在代码实现中如何选择使用哪一种。
39.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

主要区别

  1. 传输协议
    • TCPServer:基于TCP协议,是面向连接的可靠传输协议。数据在传输前需要先建立连接,数据会按照发送顺序有序到达,且不会丢失或重复,适合对数据准确性要求高、数据量大且对实时性要求不是特别高的场景,如文件传输、HTTP协议等。
    • UDPServer:基于UDP协议,是无连接的不可靠传输协议。数据发送前不需要建立连接,传输速度快,但数据可能会丢失、重复或乱序到达,适合对实时性要求高、对数据准确性要求相对较低的场景,如实时视频流、音频流传输等。
  2. 通信方式
    • TCPServer:是流式传输,数据像水流一样不间断传输,接收方按顺序接收字节流,然后根据应用层协议进行解析。
    • UDPServer:以数据包为单位传输,每个数据包都有自己的边界,接收方一次接收一个完整的数据包。

代码实现中的选择

  1. 数据准确性优先:如果应用场景对数据准确性要求极高,如金融交易系统、数据库同步等,应选择TCPServer。在代码实现中,使用SocketServer.TCPServer类来创建服务器实例。例如:
import SocketServer


class MyTCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print(f"{self.client_address[0]} wrote:")
        print(self.data)
        self.request.sendall(self.data.upper())


if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()
  1. 实时性优先:当应用场景对实时性要求高,如在线游戏、直播等,可选择UDPServer。在代码实现中,使用SocketServer.UDPServer类来创建服务器实例。例如:
import SocketServer


class MyUDPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        print(f"{self.client_address[0]} wrote:")
        print(data)
        socket.sendto(data.upper(), self.client_address)


if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler)
    server.serve_forever()