2011-11-27 2 views
8

여기에는 2 개의 관련 질문이 있습니다. 그들을 함께 게시하는 것이 더 합리적입니다. 1socket.io를 사용하여 연결된 클라이언트 목록을 만듭니다.

상담자는 모든 클라이언트에서 이벤트를 방출하는 Node.js를 응용 프로그램을 가지고 있고, 현재의 모든 클라이언트는 ready 개의 발광으로 응답합니다. 초기 발광에 응답 한 모든 클라이언트의 목록을 만들려면 어떻게해야하며 클라이언트를 구별하기 위해 어떤 종류의 ID를 사용할 수 있습니까?

Question2 : 내가 연결된 클라이언트 목록을 한 후 이렇게 수집하기 위해 노력하고 무엇

, 다음 행 N 수의 MySQL 데이터베이스 테이블에 액세스하고 각 클라이언트에게 X 행 각을 지정하는 것입니다. 이 행은 해당 클라이언트로 다시 전송됩니다. 어떻게 할 수 있습니까?

현재 코드 QN 1

노드 코드

setInterval(function() { 
    util.log('Checking for new jobs...'); 
    dbCheckQueue(function(results) { // checks if there are new rows to "distribute" to clients 
     if (results.length) { 
      util.log(results.length + ' new jobs found.'); 
      io.sockets.emit('job_available'); 
     } 
    }); 
}, 10*1000); 

클라이언트 측 코드 JS

socket.on('job_available', function() { 
       console.log('Job Available.. Responding with Ready!'); 
       socket.emit('ready'); 
      }); 

io.sockets.on('connection', function(socket) { 
    socket.on('ready', function() { 
     // UPDATE N rows with client_id in column checkout. 
     // Then SELECTS * from table where checkout = client_id 
     getListings(client_id, function(listings) { 
      socket.emit('job', listings); // send jobs 
     }); 
    }); 
}); 

현재 코드 QN 2위한이 코드는 단일 클라이언트에서 작동하지만 연결된 모든 클라이언트를 반복하고 어떻게 동일한 열을 업데이트하고 행을 선택합니까?

io.sockets.on('connection', function(socket) { 
    socket.on('ready', function() { 
     // UPDATE N rows with client_id in column checkout. 
     // Then SELECTS * from table where checkout = client_id 
     getListings(client_id, function(listings) { 
      socket.emit('job', listings); // send jobs 
     }); 
    }); 
}); 

답변

16

연결된 클라이언트를 직접 추적해야합니다. 당신의 ready의 이벤트 핸들러, 또는 무엇에

var clients = []; 

io.sockets.on('connect', function(client) { 
    clients.push(client); 

    client.on('disconnect', function() { 
     clients.splice(clients.indexOf(client), 1); 
    }); 
}); 

는 그런 다음 참조 서버 clients 배열이 당신이 필요로 할 때마다 것을 : 그 작업을 수행하는 간단한 방법은 배열을 사용하는 것입니다. 뭔가 같은 :

io.sockets.on('connection', function(socket) { 
    socket.on('ready', function() { 
     // UPDATE N rows with client_id in column checkout. 
     // Then SELECTS * from table where checkout = client_id 
     clients.forEach(function(client, index) { 
      var client_id = index; // Just use the index in the clients array for now 
      getListings(client_id, function(listings) { 
       socket.emit('job', listings); // send jobs 
      }); 
     }); 
    }); 
}); 
+0

당신은 getISPLING() 함수의 논리를 입증 할 수 있습니까? 처음으로 로그인 한 사용자. – johannesMatevosyan

+0

'getListings' 호출은 원래 질문에서 가져온 샘플 코드 일뿐입니다. 내가 무엇을 포함하고 어떻게 구현되는지 전혀 모른다. – rossipedia

+0

배열에 클라이언트를 저장하고 있기 때문에'foreach' 또는'for' 루프의 hepl로 검색하려고 할 때 브라우저에 처음 로그인 한 클라이언트의 사용자 이름 만 있습니다. – johannesMatevosyan

19

Socket.io는을위한 공개 API를 제공합니다, 그래서 대신 브라이언처럼 뭔가를 해킹은 당신이 사용할 수있는 제안 : 뜻이 모든 연결의 배열을 반환

io.sockets.clients() 

을 고객.

당신은 특정 네임 스페이스에 연결된 모든 클라이언트를 원하는 경우 :

io.of('/namespace').clients() 

그러나 당신이 방에있는 모든 소켓이 원한다면 당신도 .. 심지어 더 필터링 할 수 있습니다

io.sockets.clients('room name here as first argument') 

을 방에 연결된 소켓 어레이를 반환합니다.

+0

감사합니다 3rdEden, Bryan의 솔루션을 약간 수정하여 사용했습니다. 단지 준비된 메시지로 응답 한 연결된 클라이언트 만 배열에 푸시되기를 원하기 때문입니다. API를 사용하면 다른 방식으로이를 수행 할 수 있습니까? – Nyxynyx

+0

실제로 api로 약간 해킹하는 것이 socket.isReady = true와 같은 것이 었습니다. 준비가 완료되면 다른 목록을 보지 못하게됩니다. P – ShrekOverflow

+0

이것은 갈 길입니다! 고마워요 :) –

관련 문제