2011-10-02 2 views
2

node.js와 socket.io를 시험 중입니다. 내 서버에서 업데이트를 가져와야하는 핑 기능을 제거하는 데 사용하지 않을 것입니다. 여기에 내가 뭘하는지의 예제 코드는 다음과 같습니다Socket.io가 연결된 모든 소켓에 메시지를 보내지 않았습니다.

var app = require('http').createServer(), 
    io = require('socket.io').listen(app), 
    cp = require('child_process'); 

app.listen(8080); 

//I check a global value for all the connected users from the php command line 
var t = setInterval(function(){ 
    cp.exec('/usr/bin/php /Users/crear/Projects/MandaFree/symfony api:getRemainingMessages', 
    function(err, stdout){ 
     if (err) { 
     io.sockets.emit('error', 'An error ocurred while running child process.'); 
     } else { 
     io.sockets.emit('change', stdout); 
     } 
     console.log('Remaining messages: ' + stdout); 
    }); 
    }, 3000); 

var remaining = io.of('/getRemainingMessages') 
    .on('connection', function(socket){ 
    socket.on('disconnect', function(){}); 
    }); 

여기 문제, 내가 io.sockets.emit()를 호출 할 때 디버그 콘솔이 뭔가를하고있는 나에게 말한다, 그러나 그것처럼 보이는 것입니다 고객에게 다가 가지 않습니다. 왜냐하면 그들은 아무것도하지 않기 때문입니다.

나는 연결된 모든 클라이언트에 대해 하나의 간격을 사용하며, socket.emit()을 사용했을 때 제대로 작동했습니다. 그러나 그것은 최적의 솔루션이 아닙니다.

업데이트 : 여기 내 클라이언트 측 코드입니다.

var remaining = io.connect('http://127.0.0.1:8080/getRemainingMessages'); 
remaining.on('change', function(data){ 
    console.log('Remaining messages: ' + data); 
    $('#count').html(data); 
}); 
remaining.on('error', function(error){ 
    console.log(error); 
}); 
+0

클라이언트 측 코드에는 'error'와'change' 둘 다 처리기가 있습니까? 문제를 파악하는 데 도움이되는 해당 코드를 여기에 포함 할 수 있습니다. – Fosco

+0

@Fosco 클라이언트 측 코드를 업데이트하고 추가했습니다. 루프가 서버의 소켓 구성에있을 때 작동합니다. 하나의 루프로 변경하고 모든 사람에게 메시지를 보내면 작동이 멈췄습니다. –

답변

1

몇 달 전과 매우 비슷한 문제가 있었고 socket.io에 API가 일부 변경되었습니다. 저는 심포니와 함께 일한 적이 없으며 문제가 동일하기를 희망합니다.

난 socket.io의 작동 데모 전송 및 메시지 수신 한 - socket.sockets.on

socket.on 변경 - 서버 측

  1. 본질적으로 두 개의 변화를 기준으로 https://github.com/parj/node-websocket-demo 업로드를

    var socket = io.listen(server); 
    socket.sockets.on('connection', function(client) 
    
  2. 클라이언트 쪽 - URL 및 포트는 자동 감지되므로 필요하지 않습니다.

var socket = io.connect(); 
이 익스프레스 2.5.2 및 Socket.io를 사용하여 테스트되었습니다 0.8.7 난 내와 서버 코드를 합병 한

, 서버에서이 작업을 시도 할 수있을 것이며, 내 client javascriptclient html이 제대로 작동하는지 확인 하시겠습니까?

var socket = io.listen(server); 

socket.sockets.on('connection', function(client){ 
    var connected = true; 

    client.on('message', function(m){ 
    sys.log('Message received: '+m); 
    }); 

    client.on('disconnect', function(){ 
    connected = false; 
    }); 

    var t = setInterval(function(){ 
    if (!connected) { 
     return; 
    } 

    cp.exec('/usr/bin/php /Users/crear/Projects/MandaFree/symfony api:getRemainingMessages', 
    function(err, stdout){ 
     if (err) { 
     client.send('error : An error ocurred while running child process.'); 
     } else { 
     client.send('change : ' + stdout); 
     } 
     console.log('Remaining messages: ' + stdout); 
    }); 
    }, 3000); 

    t(); 

}); 
+0

벽에서 내 머리를 두드리는 시간 후에 숲에서 나를 빠져 나왔습니다. Socket.IO 문서는 쓰레기입니다. Upvote 고마워요! – Thomas

관련 문제