0

NodeJS は、クライアントが HttpLongPolling と WebSocket を介してチャット ルームにサブスクライブするマルチ チャット ルーム アプリケーションをサポートできますか? チャット ルーム ソリューションについて考えると、長いポーリング リクエストへのブロードキャスト中に同期ブロックが必要であり、メッセージが diff で受信されたときにソケット接続が必要であることがわかります。周波数。私の知る限り、JS にはマルチスレッドと同期ブロックの概念はありませんが、それでも JS でグローバル変数にアクセスするには、同期ブロックが必要です。私の問題は、チャット ルーム ソリューションを開発することではありませんが、チャット ルーム ソリューションに似ています。つまり、チャンネルを購読しているさまざまなユーザーにタイムリーにメッセージをブロードキャストすることです。NodeJs はこれに適した選択ですか?

私は CometD を分析しましたが、このソリューションには正しい選択であると思われます。このソリューションには、チャネル コンセプトを備えたシステムに組み込まれたソリューションが付属しています。しかし、CometD にはスケーラビリティの問題があるため、軽く見えるが NodeJs でこのソリューションを開発する必要がある nodejs を試しています。メッセージを処理する必要はありませんが、ブラウザ クライアントに渡すだけです。

なにか提案を ?

4

1 に答える 1

1

静的ファイル、ロングポーリング (comet)、ソケット、複数の言語 (c、PHP、ノード) の Websocket を使用して、いくつかのマルチユーザー/マルチルーム アプリケーションを実行しましたが、今日では最高のエクスペリエンスは NodeJS + Socket.IO からのものです。

とても簡単です... Socket.IO は、ロングポーリングから websocket または flashsocket までを使用して、利用可能なクライアントの制限に適応するためです。それでも、ロングポーリングへの依存度が低いほど最高です。

Socket.IO サーバーを作成して構成し、部屋に出入りするための 2 つのイベント (管理したい残りのイベントに加えて)。アプリケーションの簡単な骨組みはこれです。ユーザーリスト、ユーザー名などを制御する必要がありますが、socket.id でユーザーのデータをインデックス化し、接続/切断イベントでそのハッシュを管理することは簡単にできます。「fn」はクライアント コールバック関数です。

var http      = require('http')
  , ioo       = require('socket.io')
  ;

var app = http.createServer();
var io  = ioo.listen(app);

// ... Place here Socket.IO configuration...

var port = 8080;
app.listen( port, function() { console.log( 'Server started' ); } );

io.sockets.on( 'connection', function( socket ) {
    // Management messages
    socket.on( 'connect', function( name, fn ) { connect( socket, name, fn ); });
    socket.on( 'disconnect', function() { disconnect( socket.id ); });

    socket.on( 'joinRoom', function( roomName, fn ) { joinRoom( socket, roomName, fn ); });
    socket.on( 'leaveRoom', function( roomName, fn ) { leaveRoom( socket, roomName, fn ); });
} );


...


function joinRoom( socket, roomName, fn ) {
    socket.join( roomName );
    socket.broadcast.to( roomName ).emit( 'serverMessage', 'a user enters' );
    socket.emit( 'message', 'You enter in room ' + roomName );
}

function leaveRoom( socket, roomName, fn ) {
    socket.leave( roomName );
    socket.broadcast.to( roomName ).emit( 'serverMessage', 'a user leaves' );
    socket.emit( 'message', 'You leave room ' + roomName );
}

関数Socket.IO ルームの完全な説明については、Socket.IO サイトを参照してください。

于 2013-01-28T11:34:26.897 に答える