การส่งข้อความไปยัง ID เฉพาะใน Socket.IO 1.0


85

ฉันต้องการส่งข้อมูลไปยังรหัสซ็อกเก็ตเฉพาะหนึ่งรหัส

เราเคยทำได้ในเวอร์ชันเก่า:

io.sockets.socket(socketid).emit('message', 'for your eyes only');

ฉันจะทำสิ่งที่คล้ายกันใน Socket.IO 1.0 ได้อย่างไร

คำตอบ:


206

ใน socket.io 1.0 มีวิธีที่ดีกว่าสำหรับสิ่งนี้ แต่ละซ็อกเก็ตจะรวมห้องเริ่มต้นโดยอัตโนมัติด้วยรหัสตนเอง ตรวจสอบเอกสาร: http://socket.io/docs/rooms-and-namespaces/#default-room

ดังนั้นคุณสามารถส่งไปยังซ็อกเก็ตโดยใช้รหัสต่อไปนี้:

io.to(socketid).emit('message', 'for your eyes only');

มีความแตกต่างระหว่าง (room_id) และ (user_socket_id) อย่างไร ฉันใช้มันเพื่อส่งข้อความไปยังห้องที่สามารถมีผู้ใช้ได้ตั้งแต่หนึ่งคนขึ้นไป "วิธีนี้ทำให้ง่ายต่อการกระจายข้อความไปยังซ็อกเก็ตอื่น ๆ :" จากนั้นอาจเป็นหนึ่งหรือมากกว่านั้นก็ได้ไม่ใช่แบบส่วนตัวที่ไม่ซ้ำใคร
Washington Botelho

@WashingtonBotelho รหัสซ็อกเก็ตมักจะมีลักษณะคล้ายกับ "Uj5CRqZ5b_Xubx9sAAAA" ดังนั้นในทางทฤษฎีอาจมีผู้ใช้มากกว่าหนึ่งคนในห้องดังกล่าว แต่ในทางปฏิบัติฉันไม่รู้ว่าจะเพิ่มผู้ใช้ในห้องส่วนตัวของผู้ใช้คนอื่นเมื่อใด
Oleg

9
เราจะระบุผู้ใช้เฉพาะโดยใช้ socketId ได้อย่างไรหมายความว่าเราจำเป็นต้องจัดเก็บคู่ค่าคีย์ของผู้ใช้ (เช่นชื่อผู้ใช้) และ socketId ไว้ที่ใดที่หนึ่ง
สาย

@Mustafa Dokumacı merhaba, bana bir yardim et stackoverflow.com/questions/38817680/…
mahdi pishguy

มันผิดตรรกะมาก ... ทำไมไม่เพียงแค่ให้วิธีการส่งข้อความไปยังหมายเลขรหัสซ็อกเก็ตและนั่นล่ะ อย่างไรก็ตามการโหวตเพิ่มขึ้นการแก้ไขปัญหาเดียวที่ใช้งานได้จริงในวันที่ 2.x
Adry

94

ใน socket.io 1.0 คุณสามารถทำได้ด้วยรหัสต่อไปนี้:

if (io.sockets.connected[socketid]) {
    io.sockets.connected[socketid].emit('message', 'for your eyes only');
}

อัปเดต:

คำตอบของ @ MustafaDokumacıมีทางออกที่ดีกว่า


3
ความแตกต่างระหว่างคำตอบนี้และคำตอบที่ดีกว่าก็คือด้วยวิธีนี้คุณสามารถโทรกลับได้ซึ่งเป็นสิ่งที่ดี แต่ด้วย io.to (socketid) คุณไม่สามารถใช้การโทรกลับได้
Ramazan Polat

17

@Mustafa Dokumacıและ @Curious ให้ข้อมูลเพียงพอแล้วฉันกำลังเพิ่มวิธีรับรหัสซ็อกเก็ต

ในการรับรหัสซ็อกเก็ตให้ใช้socket.id :

var chat = io.of("/socket").on('connection',onSocketConnected);

function onSocketConnected(socket){
   console.log("connected :"+socket.id);  
}

6

หากคุณใช้เนมสเปซฉันพบว่าสิ่งต่อไปนี้ใช้งานได้:

//Defining the namespace <br>
var nsp = io.of('/my-namespace');

//targeting the message to socket id <br>
nsp.to(socket id of the intended recipient).emit('private message', 'hello');

เพิ่มเติมเกี่ยวกับเนมสเปซ: http://socket.io/docs/rooms-and-namespaces/


5

ฉันเชื่อว่าทั้ง @Curious และ @ MustafaDokumacıให้โซลูชันที่ใช้งานได้ดี ความแตกต่างคือด้วยโซลูชันของ@MustafaDokumacıข้อความจะถูกส่งไปยังห้องหนึ่งไม่ใช่เฉพาะกับลูกค้ารายใดรายหนึ่งเท่านั้น

ความแตกต่างจะเห็นได้ชัดเมื่อมีการร้องขอการตอบรับ

io.sockets.connected[socketid].emit('message', 'for your eyes only', function(data) {...});

ทำงานตามที่คาดไว้ในขณะที่

io.to(socketid).emit('message', 'for your eyes only', function(data) {...});

ล้มเหลวด้วย

Error: Callbacks are not supported when broadcasting

1

ใน Node.js -> socket.io -> มีตัวอย่างการแชทเพื่อดาวน์โหลด Paste this in line (io on connection) part .. ฉันใช้รหัสนี้ที่ใช้งานได้ 100%

io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    console.log(socket.id);
    io.to(socket.id).emit('chat message', msg+' you ID is:'+socket.id);
  });
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.