2016-03-19 18 views
1

Belli bir durumum var. Sunucu A'ya bağlanan istemcim (tarayıcı) var. Sunucu A ve B sunucularına bağlanır. İstemci sunucuya mesaj gönderdiğinde, sunucuya B veya C sunucularından biri anlamına gelen belirli bir sunucuya mesaj göndermem gerekir. Bunların her ikisi de. Genelde sunucular arasında ayrı iletişime ihtiyacım var, ancak sadece haberleşmeyi yayınladım. Tüm bağlı sunucularda A sunucusundan başka bir sunucuya mesaj görülemez.Socket.io sunucuya sunucu (belirli bir sunucuya mesaj göndererek)

İletileri doğrudan sunuculardan birine nasıl gönderebilirim? İşte sunucular için kod snippet'im. Her sunucu için portları değiştirip bağlarım.

// Load requirements 
var PORT = process.env.PORT || 8080;//just change port for other servers 
var express = require("express"); 
var app = express(); 
var http = require("http").Server(app); 
var io = require("socket.io")(http); 

app.use(express.static(__dirname + '/public')); 

var client = require('socket.io-client'); 

var socket1 = client.connect('http://localhost:8081', { reconnect: true });//connection to server B 
var socket2 = client.connect('http://localhost:8082', { reconnect: true });//connection to server C 

// Add a connect listener 
io.on('connection', function (socket) { 
    console.log('Client connected.'); 
//when server receive message from client 
    socket.on('message_from_browser', function (message) { 
     console.log("Message from browser broadcasted: " + message.text); 
     var updated_message = { 
      text: message.text, 
      port: PORT 
     }; 

     // send message to server B 
     socket1.emit('server_message', updated_message);//send message to server B 
    }); 

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

socket1.on('connect', function() { 
    socket1.on('server_message', function (message) { 
     console.log('RECEIVED MESSAGE FROM ANOTHER SERVER ON PORT '+ message.port + ": " + message.text); 
    }); 
    //change server name 
    console.log('Connected to server B!'); 
}); 

socket2.on('connect', function() { 
    socket2.on('server_message', function (message) { 
     console.log('RECEIVED MESSAGE FROM ANOTHER SERVER ON PORT '+ message.port + ": " + message.text); 
    }); 
    //change server name 
    console.log('Connected to server C!'); 
}); 

http.listen(PORT, function (req, res) { 
    console.log("Server Started on port: " + PORT); 
}); 
+0

Soruyu anlamıyorum, çünkü iletiyi yalnızca istediğiniz sunucuya gönderdiğiniz kadar basit görünüyor. Eğer hem B sunucusu hem de C sunucusuna socket.io bağlantınız varsa ve gelen bir mesajın sadece B sunucusuna gönderilmesi gerekiyorsa, o zaman B sunucusuna bağlantı için soket alırsınız ve sizde 'socket.emit()' yaparsınız. sadece bu soket. Bu mesajı sadece bu bağlantıya gönderir. Sunucu A, sunucu B ve sunucu C'ye bağlantıları başlattıysa, hangi bağlantının olduğunu zaten bileceksiniz. – jfriend00

+0

Eğer sunucu B ve C sunucusu size bağlıysa, hangisinin bağlanacağını belirlemek için onlara ihtiyacınız vardır, böylece hangisinin olduğunu takip edebilirsiniz. – jfriend00

+0

Tavsiyeleriniz için çok teşekkürler. Çözümünüzü denedim ama 2 yuva oluşturduğumda ve socket.emit ('server_message', updated_message) gibi bir ileti gönderdiğimde; veya socket2.emit ('server_message', updated_message); Bu çalışmıyor ve socket.emit ('server_message', updated_message) gibi bir ileti göndermeye çalıştığımda, bu ileti de socket2'ye gönder. İkinci yorumda yazdığınız gibi, aynı zamanda soket kimliğine sahip iz sunucularını denedim ama aynı zamanda işe yaramadı. – mattafix19

cevap

1

Değişken adı socket ile adlandırma çakışması var. Bu, hem B sunucusuna bağlantınız hem de .on('connection', function(socket) {...}) geri bildirimde bir argüman olarak tanımlanır.

var socket1 = client.connect('http://localhost:8081', { reconnect: true });//connection to server B 
var socket2 = client.connect('http://localhost:8082', { reconnect: true });//connection to server C 

, o socket1 değil socket gibi sunucu B bağlantısına bakın: Buna

var socket = client.connect('http://localhost:8081', { reconnect: true });//connection to server B 
var socket2 = client.connect('http://localhost:8082', { reconnect: true });//connection to server C 

:

düzeltmek için, bu değiştirin.

socket adlı değişken zaten çakışan ada sahip olduğunda bu nedenle dış socket değişken ulaşamaz bu bir argüman olarak tanımlanır:

// Add a connect listener 
io.on('connection', function (socket) { 
    // socket variable name ^^^^^^ 
    console.log('Client connected.'); 
//when server receive message from client 
    socket.on('message_from_browser', function (message) { 
     console.log("Message from browser broadcasted: " + message.text); 
     var updated_message = { 
      text: message.text, 
      port: PORT 
     }; 

     // send message to server B 
     socket1.emit('server_message', updated_message);//send message to server B 
    }); 

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

Ve ihtiyacınız böylece gelen sunucu mesajları için hiçbir dinleyici vardı socket1 ve socket2 için dinleyiciler eklemek.

io.on('connect', function(socket1){ 
    socket1.on('server_message', function (message) { 
     console.log('RECEIVED MESSAGE FROM ANOTHER SERVER ON PORT '+ message.port + ": " + message.text); 
    }); 
}); 

io.on('connect', function(socket2){ 
    socket2.on('server_message', function (message) { 
     console.log('RECEIVED MESSAGE FROM ANOTHER SERVER ON PORT '+ message.port + ": " + message.text); 
    }); 
}); 
+0

Düzeltmeyi denedim ancak ikinci sunucunun iletileri doğru şekilde almıyor gibi görünüyor. Hata ayıkladı ve mesaj doğru gönderiliyormuş gibi görünüyor, ancak başka bir sunucu herhangi bir mesaj göstermiyor. – mattafix19

+0

@ mattafix19 - Bir kez daha, hem mesaj göndermek hem de almak için mevcut kodunuzu göstermedikçe, bu konuda size yardımcı olamayız. Socket.io düzgün kullanıldığında iyi çalışıyor. – jfriend00

+0

Bunun için üzgünüm. Tamamen anlıyorum ama kodum aynı fakat tavsiye ettiğin tek fark düzeltildi. Ve sağlanan bu kod, göndermek ve almak içindir. Ve tekrar zaman ayırdığınız için çok teşekkür ederim. – mattafix19

-1

Kullanım tek değişken ve diğerleri ana izlemek için yapılandırmaları, deneyin: Güncelleme

bazı hataları düzeltmek için:

// Load requirements 
var PORT = process.env.PORT || 8081;//just change port for other servers 
var express = require("express"); 
var app = express(); 
var http = require("http").Server(app); 
var io = require("socket.io")(http); 
var async = require('async'); // async is optional for this example ... 
var client = require('socket.io-client'); 

app.use(express.static(__dirname + '/public')); 

// save hosts here ... 
var otherServers = { 
    server1: { 
    url: 'http://localhost:8082' 
    }, 
    server2: { 
    url: 'http://localhost:8083' 
    }, 
}; 

// Add a connect listener 
io.on('connection', function (socket) { 
    console.log('Client connected.'); 
    //when server receive message from client 
    socket.on('message_from_browser', function (message) { 
     console.log("Message from browser broadcasted: " + message.text); 
     var updated_message = { 
     text: message.text, 
     port: PORT 
     }; 

     // choice how server will receive this message ... 
     // then send it 
     otherServers.server1.client.broadcast.emit('server_message', updated_message); 
    }); 

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

async.each(otherServers, function forEachOtherServer(otherServer, next) { 
    //connect to another server 
    otherServer.client = client.connect(otherServer.url, { reconnect: true }); 
    // to something more if need in every client connection ... 

    otherServer.client.on('connect', function (x) { 

    otherServer.client.on('server_message', function (message) { 
     console.log('RECEIVED MESSAGE FROM ANOTHER SERVER ON PORT '+ message.port + ": " + message.text); 
     //socket.broadcast.emit('message_from_server', message_server); 
    }); 
    console.log('Connected!'); 
    }); 

    next(); 
}, function afterConnectInAllServers(err) { 
    if (err) throw err; 
    // to something after connect in all servers ... 
}); 

http.listen(PORT, function (req, res) { 
    console.log("Server Started on port: " + PORT); 
}); 
+0

Yardımlarınız için teşekkür ederiz. Aslında kodunuzu işe alamıyorum. Sunucular arasında bağlantı kuramıyorum. Ve ben tarayıcıdan iletiyi iletmeye çalıştığımda 'otherServers.server1.client.broadcast.emit ('server_message', updated_message) 'hata,' socket'da eksik hata işleyicisi hata alıyorum. TypeError: undefined özelliği 'yayın' özelliği okunamıyor – mattafix19

+0

console.log ('otherServers'); tüm bağlı sunucuları görmek için Ve bazı hatalar düzeltmek için bu örnek kodu güncelledim –

+0

Hızlı cevaplarınız için çok teşekkür ederim. Kodunuzda async.each (otherServers, function forEachOtherServer (diğerServer, sonraki işlevler) {''yi yarattığınızı görüyorum. Bu, diğer sunuculardaki diğer sunucuların her bağlantı için bağlantı yaptığınız anlamına geliyor, değil mi? ... bir şey yap, aslında son yorumda olduğu gibi hala hatam var. Sunucularım arasında bir bağlantım yok gibi görünüyor. Neden buna ihtiyacım var, CDN ağ bağdaştırıcısı üzerinde çalışıyorum ve iletişim kurmam gerekiyor. CDN ağındaki sunucular arasında ancak mesajlar doğrudan seçili sunucuya gönderilmelidir. – mattafix19