3

2 つの異なる socket.io サーバーが相互に通信する必要があります。接続と接続socket.io-clientの区別がつかないので使えません。だから私は使用しようとしています。browser to serverserver to serversocket.io-redis

1 つは express-socket.io サーバーで、もう 1 つはスタンドアロンの socket.io サーバーです。どちらもsocket.io-redisアダプターを使用するように構成されています。Server2 から Server1 で受信したメッセージが表示されません。また、エラーはありません。

サーバー1:

var express = require('express');
var app = express();

var server = app.listen(8000,function () {
	console.log('server listening at port 8000');
});

var io = require('socket.io')(server);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

io.on('message',function (message) {
	console.log(message);
});

io.on('connection',function (socket) {
	console.log('connection');
	socket.on('message',function (message) {
		console.log(message);
	});
});

サーバー2:

var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

io.emit('message','Hi');

4

1 に答える 1

3

socket.io-redis では、あるサーバーから別のサーバーでイベントをキャプチャすることはできません。どのように機能するかは、あるサーバーから送信されたメッセージを接続された他のサーバーに単純に「プッシュ」することで、それらのサーバーがそれらのメッセージを送信できるようにします。

インスタンス A がイベント (つまりio.on('connect')) を受け取る場合、インスタンス B でそのイベントをキャプチャすることはできません。ただし、単に呼び出すだけで、すべてのインスタンスに接続されているすべてのクライアントにメッセージを送信できます。

socket.on('message', function(socket){
   socket.emit('hello', 'New message');
}

このようにして、インスタンス A または B に接続されているすべてのクライアント (自分自身を含む) にメッセージをブロードキャストします。このアプローチにより、アプリケーションを 1 つのマシン上の他のインスタンス (複数のスレッドを利用) または他のサーバーにスケールアウトできます。

サーバーが相互に「通信」する必要がある場合は、既存のトランスポート層 - Express サーバーを利用できます。さまざまなタイプのリクエストのハンドラーを作成できます。次に例を示します。

app.get('/api/clientCount', function(req, res){
  res.send(io.engine.clientsCount);
});

このようにして、socket.io インスタンス間で情報を交換したり、状態を変更したり、すべてのインスタンスに使用状況を報告させたりすることができます。覚えておくべきこと - リクエストを認証します。許可されていないユーザーからの呼び出しを受け取りたくありません:)

于 2015-05-13T17:26:50.763 に答える