socket.io - клиент подключается к двум сокетам одним сервером - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь создать сокетные соединения между клиентской стороной React и серверной стороной Node.js. Но на сервере будут размещены два сокета. Вот код на стороне сервера

var app = express();
var server = http.createServer(app);
var io = require('socket.io')(2893, {
    path: "/ws",
    resource: "/ws",
    transports: ['websocket'],
    pingTimeout: 5000
});
var redis = require('redis');
const subscriber = redis.createClient();
require('./server/route')(app, io);
require('./server/lib/subscriber')(require('socket.io').listen(server), subscriber);

Первое подключение к сокету в порядке, но мне интересно, почему не работает второе (которое подключено с помощью listen(server). Вот модуль subscriber, который я написал:

module.exports = (io, subscriber) => {

    io.sockets.on('connection', (socket) => {
        console.log(socket);
        socket.on('room', (room) => {
            socket.join(room);
        });
    });

    subscriber.on('pmessage', (pattern, channel, message) => {
        const msg = JSON.parse(message);
        const idCallcenter = msg.idCallcenter;
        return io.to(idCallcenter).emit('message', { type: channel, message: msg });
    });

    subscriber.psubscribe('*');

};

И модуль React на стороне клиента

var socketOption = { path: "/ws", transports: ['websocket'] };
var socket = io("http://localhost:2893", socketOption);
var socket2 = io.connect("http://localhost:4004");
export default function (user) {
  debugger
  socket.user = user;
  contact(socket);
  notify(socket);
  socket.on('connect', function () {
    debug('socket connect', socket.id);
    store.dispatch(connectNetworkSuccess());
    socket.emit('user-online', {
      idUser: user._id,
      idCallcenter: user.idCallcenter,
      email: user.email
    });
  });
  socket2.on('connect', () => {
    debug('Socket connected');
    socket2.emit('room', user.idCallcenter);

  });
  socket2.on('message', (data) => {
    debugger
    debug('Socket message');
    debug(data);
    const type = data.type;
    const message = data.message;
    if (type === 'recordFetched') {
    }

  });
  socket.emit('user-online', {
    idUser: user._id,
    idCallcenter: user.idCallcenter,
    email: user.email
  });
  socket.on('disconnect', function (reason) {
    debug('socket disconnect', reason);
    store.dispatch(connectNetworkFailed());
  });
} 

Первый socket (в порту 2893) работает нормально. Между тем socket2 (в порту 4004) не подключается. Он не входит в connection обратный вызов на стороне сервера и клиента. Что я тут не так сделал?

1 Ответ

0 голосов
/ 14 января 2019

Я раскрыл дело сам. Рабочий код на стороне клиента:

export default function (user) {
    debugger
    var socketOption = { path: "/ws", transports: ['websocket'] };
    var socket = env === "local" ? io("http://localhost:2893", socketOption) : io(window.location.origin, socketOption);
    var socket2 = io.connect();
    socket.user = user;
    contact(socket);
    notify(socket);
    socket.on('connect', function () {
        debug('socket connect', socket.id);
        store.dispatch(connectNetworkSuccess());
        socket.emit('user-online', {
            idUser: user._id,
            idCallcenter: user.idCallcenter,
            email: user.email
        });

    });
    socket2.on('connect', () => {
        console.log('Socket connected');
        socket2.emit('room', user.idCallcenter);

    });
    socket2.on('message', (data) => {
        debugger
        console.log('Socket message', data);
        const type = data.type;
        const message = data.message;
        if (type === 'recordFetched') {
        }

    });
    socket.emit('user-online', {
        idUser: user._id,
        idCallcenter: user.idCallcenter,
        email: user.email
    });
    socket.on('disconnect', function (reason) {
        debug('socket disconnect', reason);
        store.dispatch(connectNetworkFailed());
    });
} 

Сервер перешел на connection обратный вызов, но не room обратный вызов. Я предполагаю, что это потому, что обратный вызов connect на стороне клиента был определен после того, как соединение установлено, так что он не мог перейти в него. Это моя возможность. Я прав?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...