2012-04-18 13 views
1

私は過去1週間この特定の問題を検索していましたが、件名に関する情報が見つかりませんでした。他のものに取り組む。しかし、今私はnode.jsとsocket.ioを使ってサーバーに接続しているIDを使って特定のクライアントにデータを送信できるようにする必要があります。私は既に新しい接続ごとにオブジェクトにIDを格納しています。私が知る必要があるのは、私が選択した接続IDにそれを送信する方法です。Node.JS特定の接続IDにパケットを送信するSocket.IO

次のようなものです。function send(data、client.id){};

私はTCPではなくhttpサーバを使用しています。

これは可能ですか?

編集:

server = http_socket.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.end(respcont); 
    client_ip_address = req.header('x-forwarded-for'); 
    }); 
socket = io.listen(1337); // listen 
//============================================= 
// Socket event loop 
//============================================= 
socket.on ('connection', function (client_connect) { 
    var client_info = new client_connection_info();  // this just holds information 
    client_info.addNode(client_connect.id, client_connect.remoteAddress, 1); // 1 = trying to connet 

    var a = client_info.getNode(client_connect.id,null,null).socket_id; // an object holding the information. this function just gets the socket_id 
    client_connect.socket(a).emit('message', 'hi'); 

    client_connect.on('message', function (data) { 
     }); 
    client_connect.on ('disconnect', function() { 

    ); 
}); 

ソリューション:私はあなたがTODOを持っていることは(私はやっていたように)あなたはSOCKETを保存してください、ないsocket.idを作成し、使用することである...ただ実験によってそれを考え出しました代わりに。

client_info.addNode(client_connect.id, client_connect.remoteAddress, client_connect, 1) 

var a = client_info.getNode(client_connect.id,null,null,null).socket; 
    a.emit('message', 'hi'); 
+0

ちょうどあなたの情報のために、HTTPはTCP接続で動作するプロトコルです。 TCPは、IPを使用するプロトコルで、電気信号または光信号を使用する(ほとんど)イーサネットを使用します。 –

+0

ああありがとう。私はちょうどhttpバージョンではなくTCPバージョンのための助けを得たいと思っていませんでした。実際には、私はちょうどその前にそれについて学んだ! :) – user1328762

答えて

1

あなたがこれを行うために必要がある場合は、一番簡単な方法は、接続にIDをマップするグローバル連想配列を構築し、維持することです:あなたが必要なときに、適切な接続を検索し、普通のを使用することができます関数を送信します。アレイから接続を削除するにはいくつかのロジックが必要ですが、あまりにも苦痛ではありません。

+0

node.jsとsocket.ioのそれ以降のバージョンで可能だったので、私がしたいことを達成するための何らかの方法が必要であることは知っています。編集:私はすでに接続IDを保管していますが、他に何も一緒に保管する必要がありますか? – user1328762

+0

私は正しい答えを受け入れました。私はあなたが伝えようとしていたことを理解できませんでした。 – user1328762

+0

@Femiスケーラビリティについて考えていないなら、良い解決策です。複数のマシンで動作させるのは本当に難しいでしょう。 – freakish

1

はい、可能です。

io.sockets.socket(id).emit('message', 'data'); 
+0

うーん、私はそれが働くように思えない。私のものを呼び出す方法で私のコードを更新してください。 – user1328762

0

解決策には大きな欠点があります。スケーリング。あなたのアプリが1台のマシンをもっと必要とするときはどうしますか?内部IDを使用することも困難な場合があります。外部ID(ユーザー名など)を使用してアドバイスします。

this postと同様に、私は部屋を使って助言します(スケーリングを許可するためにRedisと一緒に)。新しいソケットごとにプライベートルームを追加します(たとえば、ユーザーの名前に基づいています)。コードは次のようになります。

socket.join('priv/' + name); 
io.sockets.in('priv/' + name).emit('message', { msg: 'hello world!' }); 

このソリューションでは、複数のマシンから任意のユーザーにイベントを送信できます。私の意見では、それは非常にシンプルでエレガントです。

+0

私はサーバーゲームエンジン用のソリューションを使用できません。ソケットとデータベースの情報を持つすべてのプレーヤーのオブジェクトを作成する必要があります。 – user1328762

+1

もちろん可能です。特定のソケットに関連するデータを格納するには、JSONエンコーディングと一緒に 'socket.set'と' socket.get'を使用できます。あなたはコンセプトを逆にする必要があります:情報をソケット内に保持する(良い)、内部情報をソケットに入れない(悪い)。 – freakish

関連する問題