MST

星途 面试题库

面试题:Python SocketServer TCP客户端的优化与异常处理

在使用SocketServer搭建Python TCP客户端时,如何优化连接的建立过程以提高效率?请详细说明并给出相应代码示例。同时,阐述在数据发送和接收过程中可能遇到的异常情况及如何处理。
17.3万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

优化连接建立过程

  1. 复用地址:设置 SO_REUSEADDR 选项,允许重用本地地址,特别是在服务器重启时可以快速绑定到相同端口,避免 Address already in use 错误。
  2. 非阻塞模式:将套接字设置为非阻塞模式,这样在连接建立时不会阻塞主线程,提高效率。

代码示例

import socket
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.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # 启动服务器
    server.serve_forever()

数据发送和接收过程中的异常情况及处理

  1. 接收数据时的异常
    • 连接断开:当客户端断开连接时,recv 方法会返回空字节串 b''。可以通过检查返回值来判断连接是否断开。
    data = self.request.recv(1024)
    if not data:
        print("Connection closed by client")
    
    • 超时:设置 socket.settimeout 来处理接收数据的超时情况。
    self.request.settimeout(5)  # 设置5秒超时
    try:
        data = self.request.recv(1024)
    except socket.timeout:
        print("Receive data timeout")
    
  2. 发送数据时的异常
    • 连接异常:如果连接已经断开,发送数据会抛出 socket.error 异常。可以捕获该异常并进行相应处理,比如重新建立连接。
    try:
        self.request.sendall(data)
    except socket.error as e:
        print(f"Send data error: {e}")
        # 重新建立连接等处理