socket.io-客户端通过同一服务器连接到两个套接字

时间:2019-01-14 15:33:18

标签: javascript node.js reactjs websocket socket.io

我正在尝试在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 :(得分:0)

我自己解决了这个案子。客户端的工作代码为:

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回调,因此它无法跳入该回调。这是我的可能性。我说的对吗?