Nodejs中刷新页面socketio会请求多次,为什么?发送成功后,有木有办法就让它停下来。

Nodejs中刷新页面socketio会请求多次,为什么?发送成功后,有木有办法就让它停下来。

如题。求解决

10 回复

Node.js 中刷新页面 Socket.io 会请求多次,为什么?

当你在浏览器中刷新页面时,浏览器会重新加载整个页面,包括所有与服务器建立的连接。对于 Socket.io 连接来说,这意味着每次页面刷新时,都会重新创建一个新的连接。因此,如果你在一个页面上刷新了多次,Socket.io 将会创建多个连接,从而导致多次请求。

发送成功后,有没有办法让它停下来?

为了防止这种情况,你需要在页面卸载或关闭之前断开 Socket.io 连接。这可以通过监听 beforeunloadunload 事件来实现。此外,你还可以在客户端代码中管理连接状态,确保在页面刷新前关闭连接。

示例代码

客户端代码(JavaScript)

// 创建一个 socket 实例
const socket = io();

// 监听 beforeunload 事件,确保在页面关闭前关闭 socket 连接
window.addEventListener('beforeunload', function (e) {
    socket.disconnect();
});

// 发送消息的示例
function sendMessage() {
    const message = document.getElementById('message').value;
    socket.emit('chat message', message);
}

// 接收消息的示例
socket.on('chat message', function(msg) {
    console.log('Message received: ' + msg);
});

服务端代码(Node.js/Express + Socket.io

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

io.on('connection', function(socket) {
    console.log('A user connected');

    // 监听消息事件
    socket.on('chat message', function(msg) {
        console.log('Message received: ' + msg);
        io.emit('chat message', msg); // 广播给所有客户端
    });

    // 监听 disconnect 事件,用户断开连接时触发
    socket.on('disconnect', function() {
        console.log('User disconnected');
    });
});

server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 客户端代码

    • 使用 io() 创建一个 Socket.io 客户端实例。
    • 监听 beforeunload 事件,在页面即将关闭时调用 socket.disconnect() 关闭连接。
    • 实现 sendMessage 函数用于发送消息,并监听 chat message 事件以接收消息。
  2. 服务端代码

    • 使用 Express 和 Socket.io 创建一个 HTTP 服务器。
    • 在连接时打印一条日志。
    • 监听 chat message 事件,将消息广播给所有客户端。
    • 在用户断开连接时打印一条日志。

通过这种方式,你可以确保在页面刷新前关闭 Socket.io 连接,避免多次请求的问题。


发送成功后你还想让它停下来?你具体选的是什么传输协议啊?

  • 像websocket是一直保持这个连接的
  • 其它的长连接形式,也是在一个请求结束后立即发出另一个请求建立连接的

过程就是从服务器发送数据到客户端,客户端接收一次成功就好了啊。可是现在,socket会emit多次。造成,数据重复出现。

那就是你的代码有问题了,检查下吧,正常情况不会emit多次的

服务器端:

this.io.on('connection', function (socket) {
            socket.emit("connect","helloworkd");
            socket.on('room', function (data) {
                console.log("收到消息"+data);
                socket.broadcast.emit('down',data);
            });
    });

客户端:

var socket = io.connect('http://127.0.0.1:3001/');
   socket.on("down"+roomid,function(array){
      console.log(array);//这里会输出多次       

});

socket.emit(“room”,“hello world”);

建立连接后,有时候发送一次数据,有时候发送多次。多次 的时候居多。是不是还要配置什么啊????

找到错误原因了,我每次刷新页面,服务端都会io.on(‘connection’…)一次。从而不断的累加。越来越多。

fyddaben 怎么解决的,发下方法,分享下

用once方法代替on方法就行了,once方法只会发出一次消息

把io.on(‘connection’…)服务端的这个连接代码,在启动服务器的时候,执行一次就可以了,在里面写具体的事件内容。把这个代码放在app.js里面执行。我开始的时候,想封装成一个模块,每次开一聊天室,执行一次模块,造成connnection不断增多。

当您在Node.js应用中使用Socket.IO时,刷新页面会导致客户端重新连接到服务器,这可能会导致多次请求。这是因为每次页面刷新时,浏览器会创建新的WebSocket连接,而旧的连接可能还未完全关闭。

为了解决这个问题,您可以在客户端代码中添加一些逻辑来确保只保留一个活动的Socket.IO连接,并在页面即将刷新或卸载时清理资源。

以下是一些示例代码:

客户端代码

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io();

  window.addEventListener('beforeunload', function() {
    // 在窗口关闭之前关闭Socket.IO连接
    socket.disconnect();
  });

  // 示例:监听服务器消息
  socket.on('server_message', function(data) {
    console.log('接收到消息:', data);
    // 可以在这里添加逻辑,确保消息只处理一次
  });
</script>

服务器端代码(Node.js)

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

io.on('connection', (socket) => {
  console.log('新客户端连接');

  socket.on('disconnect', () => {
    console.log('客户端断开连接');
  });

  socket.on('client_message', (data) => {
    console.log('接收到客户端消息:', data);
    // 处理客户端的消息
    socket.emit('server_message', { message: '处理成功' });
  });
});

server.listen(3000, () => {
  console.log('服务器运行在 http://localhost:3000');
});

解释

  1. 客户端window.addEventListener('beforeunload', ...) 监听窗口关闭事件,确保在页面刷新或关闭前关闭Socket.IO连接。
  2. 服务器端io.on('connection', ...) 监听客户端连接和断开事件。处理客户端发送的消息,并返回响应。

通过这种方式,您可以确保在页面刷新时不会创建多个不必要的连接,从而避免重复请求。

回到顶部