【问题标题】:Nodejs: disconnected client from the server by socketioNodejs:通过socketio断开客户端与服务器的连接
【发布时间】:2020-02-13 23:05:31
【问题描述】:

我尝试使用 socket.io 以实时形式发送我的数据,以便创建服务器:

const http = require('http').createServer();
const socket = require('socket.io')(http);

socket.on('connection', socket => {

    console.log('connected:', socket.client.id);

    socket.on('start', data => {
        console.log('new message from client:', data);
    });

    socket.on("disconnect", () => console.log("Client disconnected"));
});

http.listen(3000, () => console.log(`server listening on port: ${3000}`))

在客户端部分我创建了这个脚本:

const socket = require('socket.io-client')('http://localhost:3000');

socket.on('connect', () => {
    // socket connected
    socket.emit('start', { my: 'data' });
    setInterval(() => {
        socket.disconnect();
    }, 1000);

});

想象一下,在客户端连接到服务器并将数据发送到服务器后想要与服务器断开连接,所以我输入了这个命令:

setInterval(() => {
    socket.disconnect();
}, 1000);

执行此命令时出现此错误:

D:\Projects\NodeJs\SafaProjects\socket\client>node client.js
D:\Projects\NodeJs\SafaProjects\socket\client\node_modules\socket.io-client\lib\socket.js:136
Socket.prototype.emit = function (ev) {
                                 ^

RangeError: Maximum call stack size exceeded
    at Socket.emit (D:\Projects\NodeJs\SafaProjects\socket\client\node_modules\socket.io-client\lib\socket.js:136:34)
    at Socket.socket.on (D:\Projects\NodeJs\SafaProjects\socket\client\client.js:13:12)     
    at Socket.Emitter.emit (D:\Projects\NodeJs\SafaProjects\socket\client\node_modules\component-emitter\index.js:133:20)
    at Socket.emit (D:\Projects\NodeJs\SafaProjects\socket\client\node_modules\socket.io-client\lib\socket.js:138:10)
    at Socket.socket.on (D:\Projects\NodeJs\SafaProjects\socket\client\client.js:13:12)     
    at Socket.Emitter.emit (D:\Projects\NodeJs\SafaProjects\socket\client\node_modules\component-emitter\index.js:133:20)
    at Socket.emit (D:\Projects\NodeJs\SafaProjects\socket\client\node_modules\socket.io-client\lib\socket.js:138:10)
    at Socket.socket.on (D:\Projects\NodeJs\SafaProjects\socket\client\client.js:13:12)     
    at Socket.Emitter.emit (D:\Projects\NodeJs\SafaProjects\socket\client\node_modules\component-emitter\index.js:133:20)
    at Socket.emit (D:\Projects\NodeJs\SafaProjects\socket\client\node_modules\socket.io-client\lib\socket.js:138:10)

客户端如何才能不出错地与服务器断开连接?

【问题讨论】:

    标签: node.js websocket socket.io


    【解决方案1】:

    因为你一遍又一遍地打电话给socket.disconnect()。向socket.emit() 提供一个回调函数,您可以在其中调用socket.disconnect

    服务器

    const http = require('http').createServer();
    const socket = require('socket.io')(http);
    
    socket.on('connection', socket => {
    
        console.log('connected:', socket.client.id);
    
        socket.on('start', data => {
            console.log('new message from client:', data);
            socket.emit ('messageSuccess', data);
        });
    
        socket.on("disconnect", () => console.log("Client disconnected"));
    });
    
    http.listen(3000, () => console.log(`server listening on port: ${3000}`))
    

    客户

    const socket = require('socket.io-client')('http://localhost:3000');
    
    socket.on('connect', () => {
        // socket connected
        socket.emit('start', { my: 'data' };
    
    socket.on ('messageSuccess', function (data) {
     socket.disconnect();
    });
    });
    

    【讨论】:

    • 这是我的错误,我必须使用setTimeout(() => { socket.disconnect(); },1000);,但仍然出现错误@Tom Marienfeld
    • 我像你一样更改我的代码,但 function (response) 从未调用过?@Tom Marienfeld
    • 在您的客户端上将 my 更改为 start
    • socket.on('connect', () => { socket.emit('start', { my: 'data' }, function (response) { socket.disconnect(); } ); Change my to start 是什么意思? @Tom Marienfeld
    • 我走错了路。回调函数不会被调用,因为服务器没有对客户端做出任何响应。我更改了我的代码,看看它。现在,如果消息已发送,服务器将向客户端发送响应。如果客户端收到消息,它将断开连接。现在应该可以工作了。
    猜你喜欢
    • 2018-02-27
    • 2019-05-30
    • 2015-05-17
    • 2013-08-13
    • 2013-03-31
    • 2011-06-30
    • 1970-01-01
    • 2012-03-21
    • 2020-05-26
    相关资源
    最近更新 更多