2012-01-12 12 views
45

Oto mój problem:Jak połączyć dwa serwery node.js z gniazdami internetowymi?

Mam serwer A, działający plik node.js i używanie socket.io do komunikacji z klientami (przeglądarkami internetowymi). To wszystko działa dobrze i dandy.

Jednak teraz, gdy mam serwer B, który również musi łączyć się z serwerem A za pośrednictwem gniazd internetowych, uderzyłem o ścianę. Żaden z node.js klientów websocket Znalazłem nie będzie współpracować z socket.io na serwerze A.

Tak, to jest w przypadku jestem dążenie do:

.--------.  .----------.  .----------. 
| CLIENT | <--> | SERVER A | <--> | SERVER B | 
'--------'  '----------'  '----------' 

Klienta -server Połączenie odbywa się poprzez socket.io

Teraz serwer B (działający node.js) powinien połączyć się z serwerem A poprzez websocket (w celu przejścia przez port 80). Ale ...

Nawet przykładowy kod w module socket.io-klient nie działa ...:/

// Connect to server 
var socket = new io.Socket('localhost', {port: 8080}); 
socket.connect(); 

// Add a connect listener 
socket.on('connect', function(socket) { 
    console.log('Connected.'); 
}); 

Kod właśnie przechodzi bez żadnych błędów i wykonanie kończy się po kilku sekundach.

Aktualizacja: Próbki kodu

Server (który działa dobrze) wygląda następująco:

// Load requirements 
var http = require('http'), 
    io = require('socket.io'); 

// Create server & socket 
var server = http.createServer(function(req, res){ 

    // Send HTML headers and message 
    res.writeHead(404, {'Content-Type': 'text/html'}); 
    res.end('<h1>Aw, snap! 404</h1>'); 
}); 
server.listen(8080); 
io = io.listen(server); 

// Add a connect listener 
io.sockets.on('connection', function(socket) { 

    console.log('Client connected.'); 

    // Disconnect listener 
    socket.on('disconnect', function() { 
     console.log('Client disconnected.'); 
    }); 
}); 

Client wygląda następująco

console.log('1'); 

// Connect to server 
var io = require('socket.io-client') 
var socket = new io.Socket('localhost', {port: 8080}); 
socket.connect(); 

console.log('2'); 

// Add a connect listener 
socket.on('connect', function(socket) { 
    console.log('Connected!'); 
}); 

console.log('3'); 

1, 2 i 3 drukuje się dobrze , brak błędów, a kilka sekund później proces kończy się po prostu

Również serwer A nie wyprowadza cokolwiek do dziennika, mimo że mam logowanie socket.io ustawione na "wszystko".

+1

Z pewnością jesteś klientem websocket lub możesz po prostu użyć zwykłych starych gniazdek? – maerics

+0

'klientów websocket node.js znalazłem' które? – Kato

+0

Muszę przynajmniej emulować websockets, ponieważ muszę połączyć się z tym samym serwerem. – crappish

Odpowiedz

22

Okazało się, że używałem starych przykładów, z jakiegoś powodu, mimo że potrąciłem je. Cóż, doh.

Okazało się również, że klient socket.io jest uszkodzony na najnowszym węźle (6.x.x). Udało się znaleźć aktualizację z github dla niego, zastąpił pliki i tak, wszystko działa!

Edit: Niestety nie zapisywać żadnych linków do przykładów roboczych, ale po szybko przeglądając kod wydaje się, że jedyne zmiany były do ​​kodu klienta, który teraz wygląda tak:

console.log('1'); 

// Connect to server 
var io = require('socket.io-client') 
var socket = io.connect('localhost:8080', {reconnect: true}); 

console.log('2'); 

// Add a connect listener 
socket.on('connect', function(socket) { 
    console.log('Connected!'); 
}); 

console.log('3'); 
+0

Czy możesz zamieścić nowe przykłady lub wskazać je? Stoję w obliczu dokładnie tego samego problemu, z którym miałeś do czynienia. – Sudar

+0

Niestety nie zapisałem żadnych linków, ale przejrzałem działający kod i zaktualizuję różnicę, którą znalazłem w powyższej odpowiedzi. – crappish

+0

Również mój kod działa. W moim przypadku nie określiłem portu. Kod zaczął działać po dodaniu portu. – Sudar

5

Oto fragment kodu, który napisałem, używa on socket.io 1.0.6 i socket.io-client 1.0.6. Przypadek jest następujący:

Serwer A (klient Socket.io) < ---> Serwer B (Gniazdo.IO Server)

Serwer B (Server):

// Load requirements 
var http = require('http'), 
io = require('socket.io'); 

// Create server & socket 
var server = http.createServer(function(req, res) 
{ 
    // Send HTML headers and message 
    res.writeHead(404, {'Content-Type': 'text/html'}); 
    res.end('<h1>Aw, snap! 404</h1>'); 
}); 
server.listen(8080); 
io = io.listen(server); 

// Add a connect listener 
io.sockets.on('connection', function(socket) 
{ 
    console.log('Client connected.'); 

    // Disconnect listener 
    socket.on('disconnect', function() { 
    console.log('Client disconnected.'); 
    }); 
}); 

Serwer A (Klient):

console.log('1'); 
// Connect to server 
var io = require('socket.io-client'); 
var socket = io.connect('http://localhost:8080', {reconnect: true}); 

console.log('2'); 

// Add a connect listener 
socket.on('connect', function(socket) { 
    console.log('Connected!'); 
}); 

console.log('3'); 

Jeśli używam localhost: 8080 tylko na serwerze klienta nie łączy się.

+0

to działało dla mnie ... –

7

Dla przyszłych ludzi:
Oto 2 bardzo proste Node.js aplikacje używające socket.io połączyć, wysyłać i odbierać wiadomości między sobą.

pakiet Wymagane jest:

npm install socket.io 

Node-App-1 server.js:

var io = require('socket.io').listen(3000); 
io.on('connection', function (socket) { 
    console.log('connected:', socket.client.id); 
    socket.on('serverEvent', function (data) { 
     console.log('new message from client:', data); 
    }); 
    setInterval(function() { 
     socket.emit('clientEvent', Math.random()); 
     console.log('message sent to the clients'); 
    }, 3000); 
}); 

Node-App-2 client.js:

var io = require('socket.io-client'); 
var socket = io.connect("http://localhost:3000/", { 
    reconnection: true 
}); 

socket.on('connect', function() { 
    console.log('connected to localhost:3000'); 
    socket.on('clientEvent', function (data) { 
     console.log('message from the server:', data); 
     socket.emit('serverEvent', "thanks server! for sending '" + data + "'"); 
    }); 
});