簡體   English   中英

Socket.io +快遞房

[英]Socket.io + express rooms

我正在一個實時聊天的在線網站上工作,我一直在嘗試設置socket.io房間幾天,但我的一個自定義事件不會發出。

我的網站有2條路徑, //play 當某人填寫/ path中的表單時,網站會將其重定向到/play路徑。

const io = require('socket.io')(listener);

io.on('connection', socket => {

  socket.on('add user', data => { // This event gets emitted when the user submits the form at `/`, in a client-side js file. 
    socket.username = data.username;
    socket.room = data.room;
    socket.score = 0;
    socket.join(data.room);
    io.sockets.in(data.room).emit('user joined', { // This event gets 'handled', in another (not the same one) client-size js file.
    username: data.username,
    room: data.room
  });
  });

  socket.on('disconnect', function () {
   io.sockets.in(socket.room).emit('user left', {
   username: socket.username,
   room: socket.room
  });
  socket.leave(socket.room)
});


});

在另一個客戶端js文件中:

var socket = io.connect();  
let joined = 0;

socket.on('user joined', data => {
  joined++;
  console.log(joined, data)
  const elemental = document.createElement("LI");
  const info = document.createTextNode(data.username);
     elemental.appendChild(info);
   document.getElementById('people').appendChild(info)
});

添加用戶事件代碼執行得很好,但用戶加入的不是..我幾乎可以肯定它與路徑有關。 我讀了socket.io命名空間,但看起來它們就像一個不同類型的房間。 有人能告訴我什么是錯的嗎?

編輯:我應該提到沒有錯誤出現。

在沒有看到你的整個代碼的情況下,我將假設client-side.js代碼上的套接字沒有連接到data.room會議室,這就是為什么你沒有在'user join'事件監聽器上得到任何東西的原因這是因為您可能在客戶端代碼上有多個socket.io連接。

您有多種方法可以解決這個問題,具體取決於您要實現的目標。

  • 不是僅向房間內的人發射,而是向用戶加入特定房間的所有插座發射。 io.emit('user joined')而不是io.sockets.in(data.room)...
  • 應該只有一個單獨的var socket = io.connect(); 在前端,否則是發出的套接字: add user並因此加入到data.room不是正在監聽的套接字: user joined ,這就是為什么你永遠不會在該套接字上獲取事件,因為你有2個不同的套接字,一個加入房間的人,除了等待永遠不會發生的事件之外什么都沒做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM