Размещение нескольких экземпляров сервера node.js

Я новичок в node.js и изучаю, как использовать Socket.io для создания нескольких серверов чата в моем домене.

Вот сценарий:

  • Вы заходите на сайт
  • вы выбираете чат или создаете чат
  • вы присоединяетесь к этой отдельной комнате чата, в то время как другие комнаты чата работают одновременно

Довольно стандартная операция в сети, но мне еще предстоит найти способ сделать это. В частности, как разместить его на своем домене.

При создании и тестировании я всегда просто использую свой локальный хост и говорю серверу listen(8000), Однако как написать скрипт, который:

А) динамически создает новый порт прослушивания для каждого нового сервера чата?

Б) как мне разместить его (я использую Hostmonster)?

1 ответ

Вместо того, чтобы создавать отдельный сервер для каждой комнаты чата, вы можете запустить их все с одного сервера и просто сохранить карту имени комнаты чата с подключенными к ней сокетами.

Например,

//store a map of chat room name to sockets here
var chatRooms = {};

io.sockets.on('connection', function (socket) {
  //when someone wants to join a chat room, check to see if the chat room name already exists, create it if it doesn't, and add the socket to the chat room
  socket.on('joinChatRoom', function (data.message) {
    var chatRoomName = data.message;
    chatRooms[chatRoomName] = chatRooms[chatRoomName] || [];
    chatRooms[chatRoomName].push(socket);

    //set the chatRoomName into the socket so we can access it later
    socket.set( "chatRoomName", chatRoomName, function() {
      //when we receive a message
      socket.on( "chatMessage", function(data) {
        var chatMessage = data.message;
        //figure out what chat room this socket belongs to
        socket.get( "chatRoomName", function(err,chatRoomName) {
          //iterate over the sockets in the chat room and send the message
          chatRooms[chatRoomName].each(function( chatRoomSocket ) {
            chatRoomSocket.emit("chatMessage", { message : chatMessage } );
          });
        });
      });
    });   
  });
});

Обратите внимание, что этот код не проверен и является просто идеей (вероятно, вы должны рассматривать его как псевдокод). Есть множество вещей, с которыми он не справляется, например, очистка при отключениях, ошибках и т. Д. Вероятно, есть много других (и лучших) способов сделать это тоже, но, надеюсь, это даст вам больше идей.

Другие вопросы по тегам