簡體   English   中英

我將Socket.io消息發送到特定房間的代碼是否錯誤?

[英]Is my code for sending Socket.io messages to a specific room wrong?

當用戶加入時,我將其ID更改為較短的隨機代碼。 這是出於將id用作前端可見的會話ID的目的,我之所以這樣提及是因為,否則您可能會感到困惑,為什么我的套接字ID不是標准的,甚至可能與問題有關。

然后創建一個以該代碼/ id為名稱的房間,這是會話創建事件套接字處理程序中的相關代碼,其中“ client是大多數人稱為的socket而“ socket是大多數人稱為的io ,我只是用不同的方式命名它們,所以希望到目前為止很清楚:

var sessionId = client.id;
debug.log('Session ID: ' + sessionId);
debug.log('Data: ' + JSON.stringify(data, null, 3));
debug.log(JSON.stringify(socket.sockets.adapter.rooms));
client.join(sessionId);
debug.log(JSON.stringify(socket.sockets.adapter.rooms));
callback(sessions[sessionId]);

因此,在這一點上,我們通過查看socket.sockets.adapter.rooms對象(其中一個顯示在加入房間之前,而另一個顯示在房間之后)顯示一個日志,該客戶機表明客戶端是新套接字房間的成員:

[Debug][Create Session Event Handler]: Session ID: QXVLSLE
[Debug][Create Session Event Handler]: Data: {
   "name": "Jonathan"
}
[Debug][Create Session Event Handler]: {"/#0JCm5cyTpqTkXTIoAAAA":{"sockets":
{"/#0JCm5cyTpqTkXTIoAAAA":true},"length":1},"/#pqG0tzoc4i7xg8ygAAAB":{"sockets":
{"/#pqG0tzoc4i7xg8ygAAAB":true},"length":1},"/#R9HQ2k6cOqF_bodmAAAC":{"sockets":
{"/#R9HQ2k6cOqF_bodmAAAC":true},"length":1}}
[Debug][Create Session Event Handler]: {"/#0JCm5cyTpqTkXTIoAAAA":{"sockets":
{"/#0JCm5cyTpqTkXTIoAAAA":true},"length":1},"/#pqG0tzoc4i7xg8ygAAAB":{"sockets":
{"/#pqG0tzoc4i7xg8ygAAAB":true},"length":1},"/#R9HQ2k6cOqF_bodmAAAC":{"sockets":
{"/#R9HQ2k6cOqF_bodmAAAC":true},"length":1},"QXVLSLE":{"sockets":
{"QXVLSLE":true},"length":1}}

從這里開始,我將把以前的日志縮短到最后的相關信息:

"QXVLSLE":{"sockets":
    {"QXVLSLE":true},"length":1}}

接下來,我們有了套接字事件的處理程序,其中第二個客戶端希望加入會話/會議室:

debug.log('Client Joining Session: ' + sessionId);
sessions[sessionId].clients[client.id] = {
    name : name,
    id : client.id
};
debug.log(JSON.stringify(socket.sockets.adapter.rooms));
client.join(sessionId);
debug.log(JSON.stringify(socket.sockets.adapter.rooms));

然后是日志,該日志演示了客戶端已加入會議室,並再次顯示了socket.sockets.adapter.rooms對象之前和之后的對象,該對象表明新客戶端已成功加入會議室:

[Debug][Join Session Event Handler]: Client Joining Session: QXVLSLE
[Debug][Join Session Event Handler]: {"QXVLSLE":{"sockets":
{"QXVLSLE":true},"length":1}
[Debug][Join Session Event Handler]: {"QXVLSLE":{"sockets":
{"QXVLSLE":true,"L1FFBDU":true},"length":2}

因此,這似乎正常工作,但是現在,我希望下面的代碼向房間內的客戶端發送消息,並且這種情況沒有發生:

socket.to(sessionId).emit('receive message', {
    name : data.name,
    message : data.message
});

確保此代碼正在運行,我看到了日志,並且會話ID似乎正確,日志也在那里匹配。 receive message事件在服務器端發出並在客戶端被偵聽,但是沒有消息通過。 因此,我假設我在處理房間時做錯了什么,但我不知道這可能是什么。

我做房間創建/發射錯誤嗎? 還是應該在其他地方尋找問題?

哇,好吧,我知道了。 我的代碼處理房間確實存在問題:

socket.to(sessionId).emit('receive message', {
    name : data.name,
    message : data.message
});

應該只是:

socket.emit('receive message', {
    name : data.name,
    message : data.message
});

暫無
暫無

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

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