2017-04-17 9 views
0

私はsocket ioと共にnodeJSを使ってアプリケーションをビルドしています。 私は以下のなかったにserver.jsファイルがあります:サーバー側に2つのソケットを開くことは可能ですか

var app = express(); 
 
var http = require('http').Server(app); 
 
var io = require('socket.io')(http); 
 
io.on('connection', function(socket){ 
 
console.log("a user is connected"); 
 
});

をまた私は、以下の機能を持っている別のファイル「api.js」を持っている:

filter.watch(function(error, result){ 
 
    if (!error){ 
 
    var newblock = new Block(web3.eth.getBlock(result)); 
 

 
    newblock.save(function (err) { 
 
        if (err) return handleError(err); 
 
        // saved! 
 
    }) 
 
    } 
 
});

イムオブジェクトを送信しようとしている "newblock" (これは絶えず変化しています)ファイルapi.jsからソケットioを使用してserver.jsに移動します。私はapi.jsで "socket.emit( 'fromApi_toserver'、newblock)をやってみましたが、動作していません...誰にもアイデアはありますか?

+0

なぜ別のソケットを開く必要がありますか? apijsファイルで同じ 'io'インスタンスを使用し、' io.emit( 'fromApi_toserver'、 'hello world') 'を実行し、サーバjsファイル' io.on( 'fromApi_toserver'、function(msg) ){.....}) ' –

答えて

1

ここにいくつかの問題があるようです。

最初に、接続しているすべてのクライアントに送信する場合は、socket.emit()ではなくio.emit()を使用します。

第2に、ioがファイルに定義されているため、api.jsファイルでそのファイルにアクセスする場合は、そのファイルで使用できるようにする必要があります。これを行うにはいくつかの方法がありますが、最も一般的なのは、api.jsモジュールがロードされたときにモジュールコンストラクタを使ってそのファイルに渡すことです。ここではそれを行う方法です:

app.js

var app = express(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
io.on('connection', function(socket){ 
    console.log("a user is connected"); 
}); 

// pass io variable to app.js when loaded 
require('api.js')(io); 

api.js

// define module constructor 
let io; 
modules.exports = function(socketio) { 
    // save io instance for later use 
    io = socketio; 
} 

filter.watch(function(error, result){ 
    if (!error){ 
    var newblock = new Block(web3.eth.getBlock(result)); 

    newblock.save(function (err) { 
     if (err) return handleError(err); 
     // send JSON stringified version of newblock to all connected clients 
     io.emit(newblock); 
    }); 
    } 
}); 

第三に、あなたはクライアントにライブオブジェクトを送信することはできません。 socket.ioのデータは、クライアントに送信する前にJSON文字列にシリアル化され、クライアント側のsocket.ioはJSONを逆シリアル化してオブジェクトに戻します。しかし、それは単にクライアント側の明白なオブジェクトであり、特定のオブジェクトタイプではありません。データが特定のオブジェクトタイプ(クライアントサイドのBlockオブジェクトなど)である必要がある場合は、受信したデータを使用して独自の新しいクライアントサイドのBlockオブジェクトを作成する必要があります。

第4に、2番目のソケットについて質問しましたが、別のソケットは必要ありません。 ioインスタンスを使用して、現在接続されているすべてのクライアントにio.emit()で送信することができます。

+0

@Sarah - これはあなたの質問に答えましたか? – jfriend00

関連する問題