Nodejs socket.io 如何重新建立连接,以及断开连接。

Nodejs socket.io 如何重新建立连接,以及断开连接。

现在脑壳都整烦了,中文文档好少。 用的是firefox 功能: 点击开始按钮建立连接,并回传内容(这正常)。 点击断开按钮,需要断开socket,这步我用的是io.disconnect(),服务器响应了断开事件。 当再点击开始按钮时,就连不上了,什么响应都没有,给服务器发信息也发不过去。 我照着网上的用了io.reconnect(),浏览器提示reconnect is not a function。

求高手指教,不胜感激呀!

9 回复

当然可以。以下是如何使用 Node.js 和 socket.io 实现重新建立连接和断开连接的示例。

示例代码

服务器端 (server.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('A user connected:', socket.id);

    socket.on('disconnect', () => {
        console.log('User disconnected:', socket.id);
    });

    socket.on('message', (data) => {
        console.log('Message received:', data);
        socket.emit('response', `Server received: ${data}`);
    });
});

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

客户端 (index.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Socket.IO Example</title>
</head>
<body>
    <button id="start">开始</button>
    <button id="disconnect">断开</button>
    <div id="log"></div>

    <script src="/socket.io/socket.io.js"></script>
    <script>
        let socket;

        document.getElementById('start').addEventListener('click', () => {
            if (!socket || socket.disconnected) {
                socket = io(); // 创建一个新的 socket 连接
                socket.on('connect', () => {
                    log('Connected to the server');
                    socket.emit('message', 'Hello from client');
                });

                socket.on('response', (data) => {
                    log(`Response from server: ${data}`);
                });
            }
        });

        document.getElementById('disconnect').addEventListener('click', () => {
            if (socket && socket.connected) {
                socket.disconnect();
                log('Disconnected from the server');
            }
        });

        function log(message) {
            const logDiv = document.getElementById('log');
            const p = document.createElement('p');
            p.textContent = message;
            logDiv.appendChild(p);
        }
    </script>
</body>
</html>

解释

  1. 服务器端:

    • 使用 socketIo 监听客户端的连接和断开事件。
    • 当客户端发送消息时,服务器会接收并回复一个响应。
  2. 客户端:

    • 点击 “开始” 按钮时,如果当前没有连接或已断开连接,则创建一个新的 socket 连接。
    • 点击 “断开” 按钮时,断开现有的 socket 连接。
    • 使用 socket.disconnect() 方法来断开连接。
    • 使用 socket.connect() 方法来重新建立连接(实际上不需要显式调用,因为当客户端尝试发送消息时,socket 会自动重连)。

通过这种方式,你可以实现客户端与服务器之间的重新连接和断开连接的功能。


解决了,妈哟,要写成io.socket.reconnect();

socket默认是支持断开自动重新连接的 当你想要连接的时候,通过触发一个事件如xxx.emit(‘服务器某个事件’),客户端会自动连接的 不需要每次连接的时候写reconnect

咱我这没用呢,都试了 浏览器提示reconnect is not a function。

怎么搞定的啊哥们?我又遇到和你相同的问题了,客户端不关闭的前提下永远都不能断开连接,求不吝赐教啊,多谢

遇到一样问题,,求解决方法。。。。。。

v1.3.5版本。 。。 官方文档说了 可以通过 设置 ‘force new connection’: true 实现。。 reconnect() 方法报错。。 socket = io(‘http://localhost:1234’,{‘force new connection’: true}); 进行新连接设置, 再次执行 连接 就行了 。。。

淡定啊,撸主

对于你的问题,你需要了解socket.io-client中的一些关键概念。首先,io.disconnect()确实可以断开连接,但如果你希望之后能够重新连接,你需要保持io实例可用。io.reconnect()方法并不是直接调用的,而是通过管理器来处理自动重连逻辑。

你可以通过监听一些事件如disconnectconnect_errorconnect_timeout等来实现连接的重新建立。这里提供一个简单的例子:

let socket;

function connect() {
    if (socket && socket.connected) {
        console.log('Already connected.');
        return;
    }

    socket = io('http://yourserver.com'); // 连接到你的服务器

    socket.on('connect', () => {
        console.log('Connected to server');
        socket.emit('message', 'Hello Server!');
    });

    socket.on('disconnect', (reason) => {
        console.log(`Disconnected from server: ${reason}`);
        // 可以尝试在这里手动重试连接
        setTimeout(connect, 5000); // 5秒后尝试重新连接
    });

    socket.on('connect_error', (error) => {
        console.error(`Connection error: ${error}`);
        // 这里也可以尝试重新连接
    });
}

function disconnect() {
    if (socket) {
        socket.disconnect();
    }
}

在这个例子中,connect函数负责初始化socket连接并设置各种事件处理器。如果socket已经连接,则不会重复连接。disconnect函数会断开当前连接,并且如果需要,可以尝试自动重连。注意这里的重连逻辑是通过setTimeout定时调用connect函数实现的,实际应用中你可能需要更复杂的逻辑来管理重连尝试。

确保你正确引用了socket.io-client库,并且在客户端正确安装了socket.io-client包。

回到顶部