0

Express 3 と socket.io を使用して作成しているアプリにプライベート メッセージングを実装しようとしています。

クライアントがルームに接続すると、クライアントのユーザー ID が自動的に作成され、参加します。これは主に通知とその種のものです。これをプライベートチャットでも機能させようとしています.ユーザーが送信ボタンをクリックすると、メッセージは送信者のユーザーID(セッションユーザーIDから)および非表示のフィールドまたは属性から取得した所有者のユーザーIDとともに送信されます要素の。そして送信者は、所有者のユーザー ID 名前空間でルームに参加します。これに関する問題は、送信者が別のページに移動したり、ブラウザーを更新したりすると、部屋から切断され、所有者からそれ以上のメッセージを受信しないことです。オーナー ルームに再び参加するには、新しいメッセージを送信する必要があります。所有者の部屋への接続をどのように確認できますか?それとも私はこれをすべて間違っていますか?これを達成するためのより良い方法または標準的な方法はありますか?

サーバ:

io.on('connection', function (socket) {
    var sh = socket.handshake;

    socket.join(sh.session.userid);

    socket.on('chat', function (data) {
        if (data.user) {
            socket.join(data.owner);
        }
        io.sockets.in(data.owner).emit('chat',
            {user: sh.session.user, message: data.message});
    });
});

クライアント:

var socket = io.connect('https://localhost/');

$('#send_message').click(function (e) {
    socket.emit('chat',{message: $('.message').val(),
         user:$('#user'), owner:$('#owner')} //Get this from hidden fields in chat form );
    e.preventDefault();
});

socket.on('chat', function (data) {
    $('ol').prepend('<li>' + data.user + '<br />' + data.message + '</li>');
});
4

1 に答える 1

2

右。ページをリロードすると、サーバーは「クライアントが切断されました」というメッセージを受け取り、ソケットのサブスクライブを解除するためです。プライベート フィードに戻るには、クライアントは「チャット」メッセージを (同じ所有者 ID で) 再送信する必要があります。

1 つの方法は、クライアントに所有者 ID を Cookie に保存させ、ページが読み込まれるたびにそれを呼び出すことです。または、サーバーにこの情報を保存させ、セッション Cookie (http://www.senchalabs.org/connect/session.html) を使用してこの情報を呼び出すこともできます。これは本質的に、最初のオプションによく似ています。

于 2012-05-31T15:06:28.880 に答える