web-dev-qa-db-ja.com

2つのnode.jsサーバーをwebsocketに接続する方法は?

ここに私の問題があります:

サーバーAがあり、node.jsを実行し、クライアント(Webブラウザー)との通信にsocket.ioを使用しています。これはすべて正常に実行されています。

しかし、WebSocketを介してサーバーAに接続する必要があるサーバーBができたので、壁にぶつかりました。私が見つけたnode.js websocketクライアントはどれも、サーバーAのsocket.ioでは動作しません.

だから、これは私が努力しているケースです:

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

クライアントサーバーA接続はsocket.ioを介して行われます

これで、サーバーB(node.jsを実行)はwebsocketを介してサーバーAに接続する必要があります(ポート80を経由するため)。しかし...

Socket.io-clientモジュールのコード例でも動作しません...:/

// 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.');
});

コードはエラーなしでパスし、数秒後に実行が終了します。

更新:コードサンプル

サーバー(正常に動作します)は次のようになります。

// 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.');
    });
});

クライアントはこんな感じ

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、3は問題なく印刷され、エラーは発生せず、数秒後にプロセスが終了します

また、socket.ioのロギングが「すべて」に設定されていても、サーバーAはログに何も出力しません。

57
crappish

トリプルチェックを行ったにもかかわらず、何らかの理由で古い例を使用していたことがわかりました。まあ、どー。

また、最新のNode(6.xx)でsocket.io-clientが破損していることが判明しました。GitHubからの更新を見つけることができ、ファイルを置き換えて、すべてが機能しています!

編集:残念ながら、動作する例へのリンクは保存しませんでしたが、コードをすばやくざっと読んだ後、変更はクライアントコードのみであり、現在は次のようになっています:

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');
29
crappish

将来の人々のために:
2つの非常に単純なNode.jssocket.io を使用して相互に接続、メッセージの送受信を行うアプリ。

必要なパッケージは次のとおりです:

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 + "'");
    });
});
17
Bagherani

ここに私が書いたコードの抜粋があり、socket.io 1.0.6とsocket.io-client 1.0.6を使用しています。ケースは次のとおりです。

サーバーA(Socket.ioクライアント)<--->サーバーB(Socket.ioサーバー)

サーバーB(サーバー):

// 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.');
  });
});

サーバーA(クライアント):

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');

クライアントサーバーでのみlocalhost:8080を使用している場合、接続しません。

10
Regnoult