我正在使用 NodeJS 和 Socket.io。我收到來自用戶的查詢 (https://localhost:3000?id=12345) 并使用此查詢發送此特定用戶的唯一內容。現在我的問題是所有客戶端都根據最后一個客戶端的最后一個查詢獲取資料。我已經嘗試過制作房間和我在網上想過或找到的多種其他解決方案,但沒有運氣。
我收到這樣的頁面查詢,
app.get('/', async ({ query }, response) => { ... }
客戶
$(document).ready(function () {
socket.emit('room', key);
socket.on('a1', function (data) {
$("#a1").empty().append(data);
});
socket.on('a2', function (data) {
$("#a2").empty().append(data);
});
socket.on('a3', function (data) {
$("#a3").empty().append(data);
});
socket.on('a4', function (data) {
$("#a4").empty().append(data);
});
…
服務器
io.on('connection', function (socket) {
console.log('Connection');
socket.removeAllListeners();
socket.on('create', function (data) {
console.log(`Data: ${data}`);
socket.join(data);
io.in(data).emit('a1', a1);
io.in(data).emit('a2', a2);
io.in(data).emit('a3', a3);
io.in(data).emit('a4', a4);
})
});
…
我真的無法理解如何將每個客戶端查詢與服務器分開,然后將唯一的內容發送到每個客戶端,而一個客戶端的內容不會干擾另一個客戶端。我最初的想法是為每個客戶創建一個房間并使用該房間發送他們獨特的內容,但由于某種原因,內容就像是每個客戶都收到了一樣。
非常感謝你!
uj5u.com熱心網友回復:
只是你把用于管理內容的物件變成這樣更好:
客戶端:
$(document).ready(function () {
const userKey = 'unique-id-for-each-user'
socket.emit('room', {key : key, userKey : userKey});
//if you emit something in this channel (same as userKey) on server will get here
socket.on(userKey, function (data) {
if(data.key === 'a1')
$("#a1").empty().append(data.content);
if(data.key === 'a2')
$("#a2").empty().append(data.content);
if(data.key === 'a3')
$("#a3").empty().append(data.content);
});
//if you emit something in this channel ('allClients') on server will get here
socket.on('allClients', function(data) {
if(data.key === 'a1')
$("#a1").empty().append(data.content);
if(data.key === 'a2')
$("#a2").empty().append(data.content);
if(data.key === 'a3')
$("#a3").empty().append(data.content);
})
});
服務器端:
io.on('connection', function (socket) {
console.log('Connection');
socket.removeAllListeners();
socket.on('room', function (data) {
console.log(`Data: ${data}`);
if(data.key === 'a1')
io.sockets.emit(data.userKey, {key : 'a1', content: a1});
if(data.key === 'a2')
io.sockets.emit(data.userKey, {key : 'a2', content: a2});
if(data.key === 'a3')
io.sockets.emit(data.userKey, {key : 'a3', content: a3});
if(data.key === 'a4')
io.sockets.emit(data.userKey, {key : 'a4', content: a4});
})
});
如您所見,我只是更改您作為引數傳遞的變數,以提供我需要的東西,就像服務器端和客戶端一樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/405111.html
標籤:
