2017-01-11 1 views
2

openshift을 사용하여 메시징 및 브로드 캐스트 용 노드 websocket을 만들려고합니다. 아래는 제 코드입니다.Node.js는 연결된 모든 클라이언트에게 브로드 캐스트하지 않습니다.

var WebSocketServer = require('ws').Server; 
var http = require('http'); 
var ipaddr = opneshift_ip; 
var port = openshift_port; 
var server = http.createServer(); 
var wss = new WebSocketServer({server: server, path: '/connectserv'}); 

wss.broadcast = function(data) { 
    for(var i in this.clients) { 
     console.log(this.clients[i]); 
     this.clients[i].send(data); 
    } 
}; 

wss.on('connection', function(ws) { 
    console.log('a client connected'); 
    ws.on('message', function(data) { 
     console.log('>>> ' + data); 
     ws.send('got '+data); 
     if (data == 'broadcst') { 
      console.log('broadcst'); 
      wss.broadcast('Hi All'); 
     } 
    }); 
    ws.on('close', function() { 
     console.log('Connection closed!'); 
    }); 
    ws.on('error', function(e) { 
     console.log(e); 
    }); 
}); 

console.log('Listening at IP ' + ipaddr +' on port '+port); 
server.listen(port,ipaddr);  

클라이언트가 연결되면 콘솔에 "연결된 클라이언트"가 기록됩니다. 어떤 클라이언트가 메시지를 보내면 콘솔은 ">>> message"라고 쓰고 클라이언트도 마찬가지입니다 ("got message")

그러나 여러 클라이언트가 연결되어있는 경우 모든 사람에게 메시지를 브로드 캐스트하려는 경우 연결된 클라이언트, 나는 "broadcst"메시지로 보냅니다. 이상으로갑니다

if (data == 'broadcst') { 
     console.log('broadcst'); 
     wss.broadcast('Hi All'); 
    } 

하지만 메시지를 보내는 클라이언트 만이 메시지를 보냅니다.

메시지를받는 모든 클라이언트를 만드는 방법? 각 클라이언트가 별도의 세션을 생성합니까? redis를 사용하는 방법은 무엇입니까?

빠른 도움말에 감사드립니다.

감사합니다.

+0

보십시오. 모든 클라이언트 주소를 유지하는'wss.on ('connection'...)'외부에있는 목록을 가져야합니다. – sova

+0

내가 항상 목록에 하나만 표시하려고하면. 모든 소켓 연결에 대해 새 세션이 생성됩니다. 어떻게 피하는거야? –

+1

내 프로젝트 haiku.run의 소스 코드를 확인하십시오. https://github.com/sova/haiku.run/blob/master/src/index.js 57에서 clients.push (소켓) 라인을 보면 도움이 될 것입니다. 클라이언트 목록 (클라이언트라고 함)이 있는데, 누군가가 연결할 때마다 clients.push (소켓)를 사용하여 배열에 소켓을 추가합니다. 내 클라이언트 배열은 연결/세션 범위가 아닌 전역 범위에 있습니다. 그게 중요합니다. – sova

답변

0

당신이 올바른 궤도에있어

wss.broadcast = function(data) { 
    for(var i in wss.clients) { 
    console.log(wss.clients[i]); 
    wss.clients[i].send(data); 
    } 
}; 

broadcasting with wss

+0

시도 :'wss.broadcast = function (data) { for (var i in wss.clients) { console.log (wss.clients.length); wss.clients [i] .send (data); } } '하지만 그것은 또한 작동하지 않습니다. 그것은 'broadcst'를 보내는 클라이언트에게만 'Hi All'을 보냅니다. 클라이언트 배열의 길이는 항상 1입니다. 클라이언트가 보이는 각기 다른 세션을 생성합니다. –

+1

어쨌든 우리는 새로운 클라이언트가 연결될 때 서버를 새로 생성하는 대신 서버가 동일한 연결/세션을 사용하도록해야합니다. –

관련 문제