2016-09-27 25 views
0

ノードjで作業を始めました。ノードjsを使用してチャットアプリケーションを作成しようとしています。 1人のユーザーが複数のデバイスやブラウザを使用してログインできます。もし私が間違っていないと私はブラウザのIPアドレスとポートアドレスによって定義されているので、異なるポートアドレスで通信することを理解しているので、同じユーザーが2つの異なるブラウザからログインすると、ユーザーがすでに接続されている場合は、socket infoに送信します。ユーザーがすでに接続されているか、ソケットが既にユーザー用に設定されている場合は、ソケットIDを以前のソケットIDに変更する接続を作成します。 kが以前に接続された同じユーザノードjsのソケット接続

のソケットIDが今他のクライアントは、現在のユーザにメッセージを発するときに、ソケットIDが交換されている、唯一のブラウザは、メッセージ、またはそれらの両方を取得

io.on('connection', function(socket){ 
socket.id = k; 
}); 

メッセージを受け取る。サーバーの接続は、ブラウザーまたは単一のブラウザーの両方に設定されていますか。これを手伝ってください。私はまだクライアントとサーバーの間でソケット接続が確立する方法についてはまだ明確ではありません。 私が間違った仮定をしている場合、改善してください。または、次のscenerioをどうやって解決すればいいですか? ありがとうございます

答えて

2

私があなたの問題を正しく理解しているなら、私の方法で説明しよう。対応するクライアントは次のようになり

var io = require('socket.io')(somePort); //same port for the client to connect, e.g. 3000 
    io.on('connection', function(socket){ 
    // in here you should define any actions on your primary socket 
    // for example: 
     socket.on("hello", function(dataUserSendsWithTopicHello){// overly long variable name to show my point! :) 
     // do something with hello data 
     }); 

    // this will go to anyone who is connected and has a handler like above for "hello" 
     socket.emit("hello", "hello to all who listen to hello topic"); 
    }); 

var socket = io.connect('ip:port'); // e.g. localhost:3000 - same ip and port as above 

    socket.on('hello', function(serverResponseToHello){ 
    // do something when server sends back something on hello 
    }); 

// send a hello to the server 
    socket.emit("hello", "Sending hello to server"); 

を今、あなただけユーザーに返信する場合、またはグループのサーバーのために、次のコードを考えてみましょうchat.jpのルーム/ネームスペースの実装(http://socket.io/docs/rooms-and-namespaces/)を利用して、各クライアントごとに1つのルームを作成したり、クライアントのグループに1つのルームを作成したりすることができます。このために、この答えを見てみましょう:Using Socket.io with multiple clients connecting to same server

それを要約すると、1つのIPと1つのポートがあります。誰もがこのIPとポートを聞いて、3つのタブを開き、上記のような実装があると、すべてのタブが "hello"を聞きます。ルームを使用すると、ユーザーをグループ化して通信を隔離することができるため、コミュニケーションが正しいユーザー間で行われ、すべてではありません。

幸運を祈る!

+0

私の質問は、ブラウザやコンピュータによって異なる場合があります。ユーザーが複数のコンピュータからログインした場合や、ブラウザが異なる場合があります。 –

+0

異なるブラウザまたは異なるコンピュータ(ルーム/名前空間の実装をしていない場合)は、多くのタブを持つのと同じです。ソケットは 'someIp:somePort'と言うことができます。 '98.45.32.21:3000'は変更されないので、" hello "を送信すると、サーバーはhelloで(上記の実装で)全員に応答します。 – mkaran

+0

ユーザーが2つの異なるブラウザからログインして同じメッセージ(ただしメッセージのみ)を表示するようにするには、そのユーザーを正しいルームと関連付ける必要があるため、2番目のブラウザから接続し、 'sagar'、あなたは彼を正しい部屋に入れるでしょう。 – mkaran

0

私もSockets(とJS)にはかなり新しく、私はちょっと別のやり方でチャットアプリを作ろうとしています。

私の知る限り、メッセージは1つのブラウザでのみ受信されます。より良い設計は、ユーザーが複数のブラウザー/デバイスを介して接続できるようにすることです。ユーザーが接続しているすべてのソケットのリストを保持することができます(必要な場合)。

あなたは多分あなたは2人のユーザーがから接続するすべてのソケットは、シングルルームに合流され、いくつかのコードを書くことができ、1対1のチャットが必要な場合。

socket.room = roomname 
socket.join(roomname) 

次に、その部屋にメッセージをブロードキャストします。こうすることで、両方のユーザが接続しているすべてのソケットがメッセージを取得します。

socket.to(socket.room).broadcast.emit("message", message); 

(それは良いデザインであるならば、私は、何のアイデアをソケットに部屋の情報を保存していないのです)

この情報がお役に立てば幸い!