MST

星途 面试题库

面试题:网络编程之WebSocket常见错误及处理方式

在WebSocket后端开发中,列举至少3种常见的错误类型,并说明针对每种错误,你会如何在代码层面进行处理以提升程序的稳定性和用户体验。
38.4万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

连接错误

  1. 错误描述:客户端无法成功连接到WebSocket服务器,可能由于网络问题、服务器地址错误、端口被占用等原因。
  2. 代码处理
    • 在服务器端,使用异常处理机制捕获端口绑定异常。例如在Python的Tornado框架中:
import tornado.ioloop
import tornado.web
import tornado.websocket

try:
    app = tornado.web.Application([
        (r"/ws", MyWebSocketHandler),
    ])
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()
except OSError as e:
    print(f"端口绑定错误: {e},请检查端口是否被占用")
- 在客户端,使用`try - catch`捕获连接异常。以JavaScript为例:
const socket = new WebSocket('ws://localhost:8888');
socket.onerror = function (error) {
    console.log('WebSocket连接错误:', error);
    // 可以在此处添加重试逻辑
};

协议错误

  1. 错误描述:客户端和服务器之间发送和接收的数据不符合WebSocket协议规范,比如消息格式错误、版本不兼容等。
  2. 代码处理
    • 服务器端在接收消息时,进行严格的格式校验。例如在Java的Spring WebSocket中:
@Component
public class MyTextWebSocketHandler extends TextWebSocketHandler {
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        try {
            // 假设期望接收JSON格式数据,进行解析校验
            JSONObject json = new JSONObject(message.getPayload());
            // 进一步校验JSON数据结构
        } catch (JSONException e) {
            session.close(new CloseStatus(CloseStatus.PROTOCOL_ERROR, "消息格式错误"));
        }
    }
}
- 客户端在发送消息前,确保数据格式正确。同样以JavaScript为例:
const data = { key: 'value' };
const jsonData = JSON.stringify(data);
socket.send(jsonData);
socket.onmessage = function (event) {
    try {
        const receivedData = JSON.parse(event.data);
        // 处理数据
    } catch (error) {
        console.log('接收到的消息格式错误:', error);
    }
};

资源耗尽错误

  1. 错误描述:随着WebSocket连接数量的增加,服务器可能会耗尽系统资源,如文件描述符、内存等。
  2. 代码处理
    • 服务器端设置连接数量限制。在Node.js的ws模块中:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
let connectionCount = 0;
const MAX_CONNECTIONS = 100;
wss.on('connection', function connection(ws) {
    if (connectionCount >= MAX_CONNECTIONS) {
        ws.close(1011, '服务器连接数已满');
        return;
    }
    connectionCount++;
    ws.on('close', function close() {
        connectionCount--;
    });
});
- 合理管理内存,及时释放不再使用的资源。例如在Python中,对于不再活跃的WebSocket连接,及时关闭并释放相关资源:
class MyWebSocketHandler(tornado.websocket.WebSocketHandler):
    def on_close(self):
        # 清理相关资源,比如移除该连接在某个全局列表中的引用
        global connections
        if self in connections:
            connections.remove(self)