Nodejs: отключил клиента от сервера по socketio - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь использовать 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)

Как клиент может отключиться от сервера без ошибок?

1 Ответ

1 голос
/ 17 октября 2019

Потому что вы звоните 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();
});
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...