2011-12-21 6 views
12

저는 node.js + socket.io를 사용하여 실시간 뉴스 피드와 같은 간단한 시스템을 구축하고 있습니다.node.js + socket.io는 특정 클라이언트가 아닌 서버에서 브로드 캐스팅됩니까?

"읽기 전용"시스템이므로 클라이언트는 데이터를 연결하고 수신하지만 클라이언트는 실제로 자신의 데이터를 보내지 않습니다. 서버는 모든 클라이언트에 보낼 메시지를 생성하고 클라이언트는 메시지를 생성하지 않습니다. 아직 나는 방송 할 필요가있다.

documentation for socket.io's broadcast (페이지의 끝)

단순히 emitsend 메서드 호출에 broadcast 플래그를 추가, 브로드 캐스트하려면 말한다. 방송이란 시작하는 소켓을 제외한 모든 사람들에게 메시지를 보내는 것을 의미합니다.

그래서 나는 현재 해당 소켓 이 새로운 클라이언트가 새로운 데이터 다른 모든 클라이언트를 얻을 수 있도록 그 소켓에 broadcast.emit()에 다음 변수에, emit()를 연결하는 가장 최근의 클라이언트를 캡처 . 하지만 여기서 클라이언트의 역할이 socket.io가 이미 지원한다고 생각한 것에 대한 해결 방법이라고 생각합니다.

서버가 시작한 이벤트를 기반으로 모든 클라이언트에 데이터를 보내는 방법이 있습니까??

내 현재의 접근 방식은 대략 다음과 같습니다

var socket; 

io.sockets.on("connection", function (s) { 
    socket = s; 
}); 

/* bunch of real logic, yadda yadda ... */ 

myServerSideNewsFeed.onNewEntry(function (msg) { 
    socket.emit("msg", { "msg" : msg }); 
    socket.broadcast.emit("msg", { "msg" : msg }); 
}); 

는 기본적으로 데이터가 클라이언트로 전송이 필요하게 이벤트가 모든 서버 측이 아닌 클라이언트 측입니다.

답변

16

왜 아래처럼하지 않습니까?

io.sockets.emit('hello',{msg:'abc'}); 
+0

나는'io.sockets.emit'이 정의 된 함수가 아니라는 오류가 발생했습니다. – d11wtq

+0

그것은 나를 위해 작동합니다 : P, 어떤 버전의 소켓 io를 사용하고 있습니까 – user482594

+2

흠, 실제로'io.sockets.broadcast.emit()'을 시도한 것처럼 보입니다. – d11wtq

4

이벤트가 서버 측에서만 발생하므로 서버에 맞게 EventEmitter을 만들어야합니다.

var io = require('socket.io').listen(80); 
    events = require('events'), 
    serverEmitter = new events.EventEmitter(); 

io.sockets.on('connection', function (socket) { 
    // here you handle what happens on the 'newFeed' event 
    // which will be triggered by the server later on 
    serverEmitter.on('newFeed', function (data) { 
    // this message will be sent to all connected users 
    socket.emit(data); 
    }); 
}); 

// sometime in the future the server will emit one or more newFeed events 
serverEmitter.emit('newFeed', data); 

참고 : newFeed은 이벤트의 예입니다. 원하는만큼의 이벤트를 가질 수 있습니다.

중요

솔루션은 위의 더 나은 또한 미래에 당신이 일부 고객에게 특정 메시지를 방출해야 할 수도 있기 때문이다, 모든 (따라서 조건이 필요합니다). 더 단순한 경우 (무엇이든 상관없이 모든 클라이언트에게 메시지를 내 보냅니다), io.sockets.broadcast.emit()입니다. 실제로 맞습니다.

+0

아, 나는 (이 노드를 사용하여 내 첫 날) 기존의 관찰자 디자인 패턴의 이상으로이기는하지만, 전 매우 비슷한 일을했다,하지만 난 루프가 비효율적이라고 우려했다. 새 메시지는 7 초마다 약 10,000 명의 클라이언트에 브로드 캐스팅됩니다. – d11wtq

+0

나는 브로드 캐스트가 효율적인 알고리즘을 사용한다고 생각했지만 아마도 추상화 일 뿐이다. 당신의 접근 방식을 시도해 보겠습니다;) – d11wtq

+0

주제가 약간 벗어나지 만 연결 해제를 처리해야합니까, 그렇지 않으면 socket.io/node가 저를 돌 봅니까? 죽은 사건 관찰자들처럼 끝날 것 같네요. – d11wtq

관련 문제