MST

星途 面试题库

面试题:网络编程之WebSocket连接管理基础

请阐述在WebSocket连接管理中,如何处理连接的建立与关闭,以及常见的错误处理机制有哪些?
31.7万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

连接建立

  1. 前端
    • 使用 new WebSocket(url) 创建WebSocket对象,url 是服务器的WebSocket地址。例如:
    const socket = new WebSocket('ws://localhost:8080');
    
    • 监听 open 事件,当连接成功建立时触发。可以在这个事件中执行一些初始化操作,比如发送认证信息等。
    socket.onopen = function (event) {
        console.log('WebSocket连接已建立');
        socket.send('认证信息');
    };
    
  2. 后端(以Node.js为例)
    • 使用 ws 库(或其他WebSocket库)来创建WebSocket服务器。
    const WebSocket = require('ws');
    const wss = new WebSocket.Server({ port: 8080 });
    wss.on('connection', function connection(ws) {
        console.log('新的WebSocket连接');
    });
    
    • 可以在连接时进行一些身份验证等操作,比如检查请求头中的认证信息。如果认证失败,可以关闭连接。
    wss.on('connection', function connection(ws, req) {
        const token = req.url.split('=')[1];
        if (!isValidToken(token)) {
            ws.close(1008, '认证失败');
            return;
        }
        console.log('认证通过,新的WebSocket连接');
    });
    

连接关闭

  1. 前端
    • 可以主动调用 socket.close() 方法关闭连接。例如:
    socket.close();
    
    • 监听 close 事件,当连接关闭时触发。可以在这个事件中做一些清理工作,比如取消未完成的请求等。
    socket.onclose = function (event) {
        console.log('WebSocket连接已关闭');
        // 清理操作
    };
    
  2. 后端
    • 调用 ws.close() 方法关闭指定的WebSocket连接。例如:
    wss.on('connection', function connection(ws) {
        // 某个条件满足时关闭连接
        if (someCondition) {
            ws.close(1000, '正常关闭');
        }
    });
    
    • 监听 close 事件,对连接关闭进行记录或做一些后续处理。
    wss.on('connection', function connection(ws) {
        ws.on('close', function close(code, reason) {
            console.log(`WebSocket连接关闭,代码: ${code},原因: ${reason}`);
        });
    });
    

常见错误处理机制

  1. 连接错误
    • 前端:监听 error 事件,当WebSocket连接发生错误时触发。例如网络故障、服务器不可达等情况。
    socket.onerror = function (error) {
        console.error('WebSocket连接错误:', error);
        // 可以尝试重新连接
        setTimeout(() => {
            socket = new WebSocket('ws://localhost:8080');
        }, 5000);
    };
    
    • 后端:在服务器端创建WebSocket服务器时,监听 error 事件。例如端口被占用等错误。
    const WebSocket = require('ws');
    const wss = new WebSocket.Server({ port: 8080 });
    wss.on('error', function error(err) {
        console.error('WebSocket服务器错误:', err);
    });
    
  2. 数据处理错误
    • 前端:在 message 事件处理中,如果接收到的数据格式不符合预期等情况,可以进行错误处理。
    socket.onmessage = function (event) {
        try {
            const data = JSON.parse(event.data);
            // 处理数据
        } catch (error) {
            console.error('数据解析错误:', error);
        }
    };
    
    • 后端:在接收和处理客户端发送的数据时,如果数据格式错误等,可以关闭连接并返回错误信息。
    wss.on('connection', function connection(ws) {
        ws.on('message', function message(data) {
            try {
                const jsonData = JSON.parse(data);
                // 处理数据
            } catch (error) {
                console.error('数据解析错误:', error);
                ws.close(1008, '数据格式错误');
            }
        });
    });
    
  3. 协议错误
    • 当客户端和服务器端使用的WebSocket协议版本不一致或违反协议规定时,会出现协议错误。在WebSocket库中,一般会自动处理协议相关的基本错误,如错误的握手等。但如果涉及自定义协议扩展等情况,需要在代码中进行额外的检查和处理。例如,在握手过程中检查协议版本是否匹配,如果不匹配,关闭连接并返回相应的错误信息。
    // 假设自定义协议有版本字段在请求头中
    wss.on('connection', function connection(ws, req) {
        const protocolVersion = req.headers['custom - protocol - version'];
        if (protocolVersion!== expectedVersion) {
            ws.close(1010, '协议版本不匹配');
            return;
        }
        // 正常处理连接
    });