面试题答案
一键面试连接建立
- 前端:
- 使用
new WebSocket(url)
创建WebSocket对象,url
是服务器的WebSocket地址。例如:
const socket = new WebSocket('ws://localhost:8080');
- 监听
open
事件,当连接成功建立时触发。可以在这个事件中执行一些初始化操作,比如发送认证信息等。
socket.onopen = function (event) { console.log('WebSocket连接已建立'); socket.send('认证信息'); };
- 使用
- 后端(以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连接'); });
- 使用
连接关闭
- 前端:
- 可以主动调用
socket.close()
方法关闭连接。例如:
socket.close();
- 监听
close
事件,当连接关闭时触发。可以在这个事件中做一些清理工作,比如取消未完成的请求等。
socket.onclose = function (event) { console.log('WebSocket连接已关闭'); // 清理操作 };
- 可以主动调用
- 后端:
- 调用
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}`); }); });
- 调用
常见错误处理机制
- 连接错误:
- 前端:监听
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); });
- 前端:监听
- 数据处理错误:
- 前端:在
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, '数据格式错误'); } }); });
- 前端:在
- 协议错误:
- 当客户端和服务器端使用的WebSocket协议版本不一致或违反协议规定时,会出现协议错误。在WebSocket库中,一般会自动处理协议相关的基本错误,如错误的握手等。但如果涉及自定义协议扩展等情况,需要在代码中进行额外的检查和处理。例如,在握手过程中检查协议版本是否匹配,如果不匹配,关闭连接并返回相应的错误信息。
// 假设自定义协议有版本字段在请求头中 wss.on('connection', function connection(ws, req) { const protocolVersion = req.headers['custom - protocol - version']; if (protocolVersion!== expectedVersion) { ws.close(1010, '协议版本不匹配'); return; } // 正常处理连接 });