连接错误
- 错误描述:客户端无法成功连接到WebSocket服务器,可能由于网络问题、服务器地址错误、端口被占用等原因。
- 代码处理:
- 在服务器端,使用异常处理机制捕获端口绑定异常。例如在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);
// 可以在此处添加重试逻辑
};
协议错误
- 错误描述:客户端和服务器之间发送和接收的数据不符合WebSocket协议规范,比如消息格式错误、版本不兼容等。
- 代码处理:
- 服务器端在接收消息时,进行严格的格式校验。例如在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);
}
};
资源耗尽错误
- 错误描述:随着WebSocket连接数量的增加,服务器可能会耗尽系统资源,如文件描述符、内存等。
- 代码处理:
- 服务器端设置连接数量限制。在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)