Socket.io: ๋ฐœ์‹ ์ž ๋ฌธ์ œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์— ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…

์— ๋งŒ๋“  2016๋…„ 06์›” 22์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: socketio/socket.io

socket.broadcast.emit() ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋Š” ๋™์•ˆ ์ด ์ด์ƒํ•œ ๋™์ž‘์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฌธ์ œ์˜ ์ƒ˜ํ”Œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

...notifyOtherClients = function(room, e, data, socket)
{
    // sending to all clients in a room except sender
    var transport = socket.broadcast.to(room);
    //
    setTimeout(function(){
        // #method1: this works as expected: all clients receive event except the sender
        socket.broadcast.to(room).emit(e, data);
        // #method2: this doesn't work though: all clients receive this event. Why?! Bug?
        transport.emit(e, data);
        // logs out 'true'
        console.log(transport === socket.broadcast.to(room));
    }, 
    1000);
};
...
notifyOtherClients("myRoom", "someEvent", { }, socket);

๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ฌด์—‡์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? #method2๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ .
๊ฐ์‚ฌ ํ•ด์š”.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š”! socket.broadcast ์‹ค์ œ๋กœ ์ž„์‹œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ (์ฆ‰, broadcast ) ๋‹ค์Œ์— ์‚ฌ์šฉ๋˜๋Š” emit ์˜จ์ด๋ผ๊ณ  socket .

ํ”Œ๋ž˜๊ทธ๋Š” ์ฒ˜์Œ ์‚ฌ์šฉ๋œ ๋‹ค์Œ ์‚ญ์ œ๋˜๋ฏ€๋กœ ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  4 ๋Œ“๊ธ€

socket.broadcast.to(room) ์˜ ์ˆ˜์ต์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@Mad-Head ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ์ฒด์ธ ๊ฐ€๋Šฅ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฐฉ๋ฒ•๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ์†Œ์ผ“ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
http://socket.io/docs/server-api/#socket #to(๋ฐฉ:๋ฌธ์ž์—ด):์†Œ์ผ“

์žฌ๋ฏธ์žˆ๋Š” ๊ฒƒ์€ ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ž„์„ ์ถ”์ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

console.log(transport === socket.broadcast.to(room));

์•ˆ๋…•ํ•˜์„ธ์š”! socket.broadcast ์‹ค์ œ๋กœ ์ž„์‹œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ (์ฆ‰, broadcast ) ๋‹ค์Œ์— ์‚ฌ์šฉ๋˜๋Š” emit ์˜จ์ด๋ผ๊ณ  socket .

ํ”Œ๋ž˜๊ทธ๋Š” ์ฒ˜์Œ ์‚ฌ์šฉ๋œ ๋‹ค์Œ ์‚ญ์ œ๋˜๋ฏ€๋กœ ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”! ํ ... ์ œ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ1

    setTimeout(function(){
        // #method1: this works as expected: all clients receive event except the sender
        socket.broadcast.to(room).emit(e, data);
    }, 
    1000);

์ƒ˜ํ”Œ2

    var transport = socket.broadcast.to(room);
    setTimeout(function(){
        // #method2: this doesn't work though: all clients receive this event. Why?! Bug?
        transport.emit(e, data);
    }, 
    1000);

๋”ฐ๋ผ์„œ ํ”Œ๋ž˜๊ทธ์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋‘ ์ƒ˜ํ”Œ์€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ์ด๊ณ  ๋‚˜๋Š” ๊ทธ ์ด์œ ๋ฅผ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด ํ•˜๋ฃจ์— 1/2 ์ •๋„ ๋ฒฝ์„ ๋‘๋“œ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

UPD: ์‹ค์ œ๋กœ @darrachequesne ๋‹น์‹  ๋ง์ด ๋งž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์†Œ์Šค๋ฅผ ์กฐ์‚ฌํ–ˆ๋‹ค. ๋งค๋ฒˆ emit()์ด ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค _rooms๊ฐ€ ํ”Œ๋Ÿฌ์‹œ๋˜๊ณ  setTimeout์ด ์•„์ง ์ง„ํ–‰ ์ค‘์ธ ๋™์•ˆ์— emit()์ด๋ผ๋Š” ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ง„ํ–‰๋˜๊ณ  ๋ฐฉ์„ ํ”Œ๋Ÿฌ์‹œํ•˜๋Š” ๋™์•ˆ ์ด์ƒํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค(ping์ด ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค)

๊ทธ๊ฒŒ ๋ฌด์Šจ ์ผ์ด์•ผ

1. setup a room with to()
2. start timeout for 1000 ms
...
[some where between 0 and 1000 ms] ping occurs i.e. emit() and flushes the room
...
3. timeout calls socket but the room's already flushed.
4. *problemo* all clients get notified including the sender socket.

@darrachequesne ์ œ์•ˆ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
์ด๊ฒƒ์„ ๋‹ซ๋Š”๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰