2014-03-28 5 views
1

나는 또 다른 2 개 서버 (모두 동일한 코드를 가지고, 노예 역할) socket.io와 socket.io-를 사용하여 하나 개의 서버 (마스터로 작동)에서 연결을 시도하고있다 다음 코드를 사용하여 클라이언트 노드 모듈 :Socket.io 클라이언트

var ioClient = require('socket.io-client'); 
var hosts = require('./hosts'); 
var x = {} 
for (var i in hosts.get) { 
    var name = 'ns' + i; 
    x[name] = ioClient.connect(hosts.get[i].url, { 'force new connection':true }); 
    x[name].on('connect', function() { 
    console.log(x[name].socket.options.host + ' connected') 
    }); 
} 

당신이 볼 수 있듯이, 나는 (파일 hosts.js에 정의) X 다른 서버에 연결하고 오브젝트의 각 소켓을 저장하려합니다. 내가 연결할 수 있어요에도 불구하고

문제는,이다, 모든 소켓은 마지막 호스트에서 온 것, 그래서 같이 결국 :

host2.pc.gg.edu connected 
host2.pc.gg.edu connected 

를 기대 값 인 경우 :

host1.pc.gg.edu connected 
host2.pc.gg.edu connected 

나는 host1의 연결을 해제하려고했습니다 다음 출력이 끝나게 :

그래서
host2.pc.gg.edu connected 

내가 asume 문제가 t이다 이 놀랍게도

var ioClient = require('socket.io-client'); 
var hosts = require('./hosts'); 
var x = {}; 
for (var i in hosts.get) { 
    eval('x.ns' + i + '= ioClient.connect(hosts.get[' + i + '].url, { "force new connection":true });x.ns' + i + '.on("connect", function() {console.log(x.ns' + i + '.socket.options.host + " connected")});'); 
} 

: 그는 재미있는 부분은 내가 동일한 코드를 수행 할 때, 대신, 객체에 변수 키를 사용하여 평가를 사용하는 온다 올바르게 분야 "options.host"

를 설정하지 소켓 나는 두 코드의 차이점을 알 수 없다.

매우 소켓이 연결

답변

2

주셔서 감사합니다 ... 나는 그것이 아마 더 자바 스크립트 오류가 아닌 socket.io 오류의 확신,하지만 난 노력의 시간 후에 해결책을 찾을 수 아니에요 문제는 on connect 콜백입니다. 보다 구체적으로, 콜백이 실제로 호출 될 때 for 루프는 이미 완료되고 변수 i과 그 이후의 변수 name은 마지막 요소를 가리킬 것이다. 루프의 각 반복 주위에 클로저를 만들어 콜백 범위 내에서 i의 현재 값을 유지함으로써이 문제를 해결할 수 있습니다. 마법처럼

for (var i in hosts.get) { 
    var name = 'ns' + i; 
    (function (name) { 
     x[name] = ioClient.connect(hosts.get[i].url, { 'force new connection':true }); 
     x[name].on('connect', function() { 
      console.log(x[name].socket.options.host + ' connected') 
     }); 
    })(name); 
} 
+0

작품은, 대단히 감사합니다 !!!! – Cea33

관련 문제