SocketIO –连接问题和群集

时间:2019-08-28 09:55:06

标签: node.js sockets express socket.io

我有一个非常简单的NodeJS应用程序,我想在Heroku上运行。 index.js文件的外观如下:

服务器(端口3030)

const http = require('http');
const os = require('os');
const express = require('express')
const throng = require('throng'); // For cluster management
const { port, env, isProduction } = require('./config/vars');
const SocketIO = require('socket.io');


// Setting up a simple express app and wrapping it with http server
const setupServer = () => {
  const app = express();

  app.use(express.static(path.join(__dirname, '../public')));

  const server = http.createServer(app);
  return server;
};


const setupSocket = (server) => {
  const io = new SocketIO(server);
  io.on('connection', (socket) => {
    console.log(`[Socket] Connection established: ${socket.id}`);
    socket.on(msg.rooms.join, (room) => {
      socket.join(room);
      socket.to(room).emit(msg.rooms.joined);
      console.log(`[Socket] User ${socket.id} joined '${room}' room`);
    });
    socket.on('disconnect', () => {
      console.log(`[Socket] Distonnected: ${socket.id}`);
    });
  });
  return io;
};

const WORKERS = (() => {
  if (!isProduction) return 1;
  return process.env.WEB_CONCURRENCY || os.cpus().length;
})();

async function master() {
  console.log(`Preparing ${WORKERS} workers...`);
  console.log('Master started.');
}

// There should be one server instance for each worker
const start = () => {
  const server = setupServer(); // Returns and `http` server instance
  const socket = setupSocket(server);
  server.listen(port, async () => {
    Logger.info(`Server – listening on port ${port}`);
  });
  return server;
};

const instance = throng({
  workers: WORKERS,
  lifetime: Infinity,
  start,
  master,
});

module.exports = instance;

客户端(端口3000)

const setupSocket = ({ room }) => {
  // Fallback if already setup
  if (window.sockets[room]) {
    return window.sockets[room];
  }
  const socket = io('http://localhost:3030');
  socket.on('connect', () => {
    console.log('[Socket] Connection established!', socket.id);
    socket.emit('room.join', room);
  });
  socket.on('room.joined', () => {
    console.log(`[Socket] Connected to ${room} room!`);
  });
  window.sockets[key] = socket;
  return socket
};

问题 –有时可以正确建立连接,但大多数情况下我都会出错

Error during WebSocket handshake: Unexpected response code: 400

这里可能是什么问题?是因为我在两个不同的端口上都拥有它,还是因为群集?

我尝试删除代码的throng部分,并仅在没有任何群集设置的情况下调用start()方法,但是问题仍然是:(

1 个答案:

答案 0 :(得分:0)

您为什么要使用http module?您在socketIO构造函数中发送的服务器实例应该是expressInstance.listen

的返回对象。

更像是这样:

const express= require('express')
const app = express()
const socketio = require('socket.io')

app.use(express.static(__dirname + '/public'))

const server = app.listen('4000',()=>{
   console.log('Listening to port:4000')
})
const io = socketio(server)

io.on('connect',(socket)=>{

   socket.broadcast.emit('new_user')

   socket.on('new_message',(message)=>{
      io.emit('new_message',message)
   })

})

源代码:socket-io chat