Skip to content
On this page

websocket

WebSocket 连接失败状态码

在 WebSocket 连接过程中,可能会遇到不同的状态码来表示连接失败的原因。以下是一些常见的 WebSocket 连接失败状态码及其含义:

1000:正常关闭。表示 WebSocket 连接被成功关闭。

1006:无法连接。表示连接尝试失败,原因可能是服务器无法访问、网络故障或其他未知错误。

1001:终端离开。表示连接由于某种原因被客户端终止,例如用户关闭了网页或离开了当前页面。

1011:服务器错误。表示服务器在处理 WebSocket 连接时发生了内部错误。

1005:无状态码。表示连接关闭时没有提供具体的状态码。

这些状态码是 WebSocket 协议定义的一部分,不同的状态码表示不同的连接状态和错误原因。需要注意的是,这些状态码是协议规定的,但实际上服务器和客户端的实现可能会有所不同,可能会返回其他自定义的状态码。

在实际应用中,你可以通过监听 WebSocket 连接的 onclose 事件来获取连接关闭时的状态码,并根据状态码进行相应的错误处理和重连操作。

需要特别注意的是,以上状态码仅涵盖了一部分常见的情况,实际应用中可能还会遇到其他状态码。因此,在处理 WebSocket 连接时,建议综合考虑各种状态码,并通过测试和日志记录来获取更准确的错误信息和状态码。

连接超时 重连

如果你只想针对连接超时的情况进行重连,可以使用以下代码作为参考:

javascript
let socket;
const maxReconnectAttempts = 5;
const reconnectInterval = 3000; // 重连间隔,单位:毫秒

function connectWebSocket() {
  socket = new WebSocket('wss://example.com'); // 替换为你的 WebSocket 服务器地址

  socket.onopen = () => {
    console.log('WebSocket 连接已建立');
  };

  socket.onclose = (event) => {
    if (event.code === 1000) {
      console.log('WebSocket 连接已关闭');
    } else {
      console.log('WebSocket 连接已断开,尝试重新连接...');
      reconnect();
    }
  };

  socket.onerror = (error) => {
    console.error('WebSocket 错误:', error);
  };
}

function reconnect() {
  let reconnectAttempts = 0;

  const reconnectTimer = setInterval(() => {
    if (reconnectAttempts < maxReconnectAttempts && socket.readyState !== WebSocket.OPEN) {
      console.log('尝试重新连接...');
      connectWebSocket();
      reconnectAttempts++;
    } else {
      console.log('已达到最大重连次数或连接已恢复');
      clearInterval(reconnectTimer);
    }
  }, reconnectInterval);
}

connectWebSocket();

在这个示例代码中,我们使用 setInterval 定时器来进行重连尝试。在每次定时器触发时,判断当前重连次数是否小于最大重连次数,并且 WebSocket 的状态不是已经打开。如果满足条件,则尝试重新连接,增加重连次数。如果达到最大重连次数或连接已恢复,清除定时器停止重连。

请注意,这个示例代码仅仅针对连接超时的情况进行重连,其他断开连接的情况不会触发重连操作。如果你需要处理其他连接错误或断开的情况,可以根据实际需求进行修改和扩展。

心跳检测和网络中断自动重连

当你使用 JavaScript 来实现 WebSocket 连接时,你可以编写一个具有心跳检测和网络中断自动重连功能的 WebSocket 客户端。下面是一个示例代码,演示了如何实现这样的 WebSocket 客户端:

javascript
const WebSocketUrl = 'wss://example.com'; // 替换为你的 WebSocket URL
const heartbeatInterval = 5000; // 心跳检测间隔时间(单位:毫秒)
const reconnectInterval = 10000; // 重连间隔时间(单位:毫秒)

let socket: WebSocket | null = null;
let heartbeatTimer: NodeJS.Timeout | null = null;
let reconnectTimer: NodeJS.Timeout | null = null;
let isConnected = false;

// 创建 WebSocket 连接
function createWebSocket() {
  socket = new WebSocket(WebSocketUrl);

  // 监听 WebSocket 事件
  socket.onopen = onSocketOpen;
  socket.onclose = onSocketClose;
  socket.onerror = onSocketError;
  socket.onmessage = onSocketMessage;
}

// 处理 WebSocket 打开事件
function onSocketOpen() {
  console.log('WebSocket 连接已打开');
  isConnected = true;

  // 开启心跳检测定时器
  startHeartbeat();
}

// 处理 WebSocket 关闭事件
function onSocketClose() {
  console.log('WebSocket 连接已关闭');
  isConnected = false;

  // 停止心跳检测定时器
  stopHeartbeat();

  // 开启重连定时器
  startReconnect();
}

// 处理 WebSocket 错误事件
function onSocketError(error: Event) {
  console.error('WebSocket 错误:', error);
}

// 处理 WebSocket 消息事件
function onSocketMessage(event: MessageEvent) {
  const message = event.data;
  console.log('收到消息:', message);

  // 在这里处理收到的消息逻辑
}

// 发送心跳检测消息
function sendHeartbeat() {
  if (socket && socket.readyState === WebSocket.OPEN) {
    // 在这里定义你的心跳消息格式
    const heartbeatMessage = 'heartbeat';

    socket.send(heartbeatMessage);
  }
}

// 开启心跳检测定时器
function startHeartbeat() {
  heartbeatTimer = setInterval(sendHeartbeat, heartbeatInterval);
}

// 停止心跳检测定时器
function stopHeartbeat() {
  if (heartbeatTimer) {
    clearInterval(heartbeatTimer);
    heartbeatTimer = null;
  }
}

// 开启重连定时器
function startReconnect() {
  if (!reconnectTimer) {
    reconnectTimer = setInterval(reconnect, reconnectInterval);
  }
}

// 停止重连定时器
function stopReconnect() {
  if (reconnectTimer) {
    clearInterval(reconnectTimer);
    reconnectTimer = null;
  }
}

// 重连 WebSocket
function reconnect() {
  if (!isConnected) {
    console.log('正在尝试重新连接 WebSocket...');
    createWebSocket();
  } else {
    stopReconnect();
  }
}

// 初始化 WebSocket 连接
function initWebSocket() {
  createWebSocket();
}

// 启动 WebSocket 客户端
initWebSocket();

在上述代码中,我们首先定义了 WebSocket 的 URL、心跳检测间隔时间和重连间隔时间。然后,我们创建了一个 WebSocket 对象,并在相应的事件处理函数中处理连接的打开、关闭、错误和消息事件。

在连接打开时,我们启动心跳检测定时器,并在每个固定的时间间隔内发送心跳消息给服务器。如果连接关闭或发生错误,我们停止心跳检测定时器,并启动重连定时器,在一定的时间间隔后尝试重新连接 WebSocket。

你可以根据实际情况修改 WebSocketUrlheartbeatIntervalreconnectInterval 的值,以及在消息事件处理函数中处理收到的消息。

请注意,上述代码仅提供了基本的实现框架,你可能需要根据你的具体需求进行进一步的定制和完善。

刷新页面重连

js
const WebSocketUrl = 'wss://example.com'; // 替换为你的 WebSocket URL

let socket = null;

// 创建 WebSocket 连接
function createWebSocket() {
socket = new WebSocket(WebSocketUrl);

// 监听 WebSocket 事件
socket.onopen = onSocketOpen;
socket.onclose = onSocketClose;
socket.onerror = onSocketError;
socket.onmessage = onSocketMessage;
}

// 处理 WebSocket 打开事件
function onSocketOpen() {
console.log('WebSocket 连接已打开');

// 在这里可以执行一些连接成功后的逻辑
}

// 处理 WebSocket 关闭事件
function onSocketClose() {
console.log('WebSocket 连接已关闭');

// 在这里可以执行一些连接关闭后的逻辑

// 清除 sessionStorage 中的连接状态
sessionStorage.removeItem('websocketConnected');
}

// 处理 WebSocket 错误事件
function onSocketError(error) {
console.error('WebSocket 错误:', error);
}

// 处理 WebSocket 消息事件
function onSocketMessage(event) {
const message = event.data;
console.log('收到消息:', message);

// 在这里处理收到的消息逻辑
}

// 初始化 WebSocket 连接
function initWebSocket() {
const isConnected = sessionStorage.getItem('websocketConnected');

if (isConnected === 'true') {
createWebSocket();
}

// 监听页面关闭事件
window.addEventListener('beforeunload', saveWebSocketState);

// 监听页面加载事件
window.addEventListener('load', loadWebSocketState);
}

// 保存 WebSocket 连接状态到 sessionStorage
function saveWebSocketState() {
sessionStorage.setItem('websocketConnected', socket && socket.readyState === WebSocket.OPEN);
}

// 加载 WebSocket 连接状态
function loadWebSocketState() {
const isConnected = sessionStorage.getItem('websocketConnected');

if (isConnected === 'true') {
createWebSocket();
}
}

// 关闭 WebSocket 连接
function closeWebSocket() {
if (socket) {
socket.close();
}
}

// 启动 WebSocket 客户端
initWebSocket();

在上述代码中,我们通过 sessionStorage 来存储 WebSocket 的连接状态。在页面关闭时,我们使用 saveWebSocketState 函数将连接状态保存到 sessionStorage 中。在页面加载时,我们使用 loadWebSocketState 函数来读取连接状态并根据需要重新建立 WebSocket 连接。

另外,我们在 beforeunload 事件和 load 事件的监听器中分别调用了 saveWebSocketState 和 loadWebSocketState 函数,以便在页面关闭和重新加载时处理 WebSocket 连接状态。

请注意,sessionStorage 中的数据是针对每个浏览器标签页的,即在同一个浏览器的不同标签页中使用 WebSocket 时,它们将是独立的。如果你需要在多个标签页之间保持 WebSocket 连接,你需要使用其他的通信机制来进行同步。