web-dev-qa-db-ja.com

socket.ioと空のメッセージキューを使用して特定のクライアントにメッセージを送信する

Socket.ioに夢中です!ドキュメンテーションは非常に悪く、それは単に真実ではありません。

Socket.io経由で特定のクライアントにフィードバックを送信したい

サーバー側は次のようになります。

app.get('/upload', requiresLogin, function(request, response) {
    response.render('upload/index.jade');
    io.sockets.on('connection', function (socket) {
        console.log('SOCKET ID ' + socket.id);
        io.sockets.socket(socket.id).emit('new', 'hello');
    });
});

クライアント側は次のようになります。

$(document).ready(function() {
    var socket = io.connect('http://localhost:80/socket.io/socket.io.js');
    socket.on('new', function (data) { 
        console.log(socket.id);
        console.log(data); 
        //$('#state').html(data.status);
    });
});

しかし、クライアントは何もしません。私はほとんどすべてを試しました。誰かが私が間違っていることを教えてもらえますか? :(

36
Valeri K

特定のクライアントにメッセージを送信するには、サーバーに接続するすべてのクライアントをオブジェクトに保存します。

var socketio = require('socket.io');
var clients = {};
var io = socketio.listen(app);

io.sockets.on('connection', function (socket) {
  clients[socket.id] = socket;
});

その後、次のようなことができます:

var socket = clients[sId];
socket.emit('show', {});
52
pkyeck

Socket.ioを介して特定のクライアントにフィードバックを送信する方法には、次の2つがあります。

  • Pkyeckが述べたように、すべてのクライアントをオブジェクトに保存します。これにより、後でこれらの特定のクライアントにルートハンドラーで送信できます。

    var sessionsConnections = {};
    sio.on('connection', function (socket) {
      // do all the session stuff
      sessionsConnections[socket.handshake.sessionID] = socket;
    });
    
  • または、socket.ioのルームサポートを使用します-各クライアントを接続中のルームにサブスクライブし、ルートハンドラー内でこのルーム経由で送信します。例:

    sio.on('connection', function (socket) {
      // do all the session stuff
      socket.join(socket.handshake.sessionID);
      // socket.io will leave the room upon disconnect
    });
    
    app.get('/', function (req, res) {
      sio.sockets.in(req.sessionID).send('Man, good to see you back!');
    });
    

了承:

http://www.danielbaulig.de/socket-ioexpress/#comment-1158

これらのソリューション例は両方とも、socket.ioとexpressが同じセッションストアを使用するように構成されているため、同じセッションオブジェクトを参照していることを前提としています。これを達成するための詳細については、上記および以下のリンクを参照してください。

https://github.com/LearnBoost/socket.io/wiki/Authorizing

18
Tom Rogers

Socket.io 1.0では、これが機能する方法です。それより前のバージョンでも動作する可能性がありますが、保証することはできません。

socket.to(socket_id_here).emit('new', 'hello');

これは、socket.ioが接続時にソケットのIDを持つルームにソケットを自動的に追加するために機能します。

また、バージョン1.0にアップグレードする予定の場合、APIには多くの変更が加えられるため、1.0で動作するようにコードを変更する必要がある場合があります。

5
Ferdi265

Socket.io 1.0+でこれを行う正しい方法は次のとおりです。

io.to(users_socket_id).emit('new', 'hello');

「users_socket_id」を部屋名に置き換えて、特定のsocket.io部屋に送信することもできます。

4
Williz

まず、クライアント側で_socket.id_を使用することはできません。

そして、行を変更します

var socket = io.connect('http://localhost:80/socket.io/socket.io.js');

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

2
Shekhar

以下のnodeとsocket.ioの最新バージョンにうんざりしています。完全なコードを投稿します。

  <ul id="messages"></ul>
<form action="">
  <input id="id1"  /><button>Send</button>
</form>
<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>

  var io = io.connect();
  $('form').submit(function(){
    io.emit('drumevent', $('#id1').val());
    $('#id1').val('');
    return false;
  });
  io.on('drumevent', function(msg){
  console.log(msg);



    $('#messages').append($('<li></li>').text(msg.message+'    quantity = '+msg.quantity));
  });
</script>

サーバー側コード

  var usernames = {};io.on('connection', function(socket){usernames["username"] = socket.id;
socket.on('drumevent', function(msg){     
var socketId = socket.id;io.to(socketId).emit('drumevent', data);
0
Adiii

Io.sockets.socketが削除され、Socket.IOで問題が発生したと思います( https://github.com/socketio/socket.io/issues/1618 )。

Io.sockets.connected [socket.id]を使用し、socket.idを保存して、ユーザー名でユーザーと参照できます。

var usernames = {};
usernames[username] = socket.id;
// Sending the message
io.sockets.connected[usernames[username]].emit(...);

私はドキュメントのどこにもそれを見ていないので、これがどのように答えられなかったかを見ることができます。また、ユーザー名による参照がない場合は、代わりに試すことができます:

users[socket.id] = socket.id;

簡単にアクセスできるようにキーと値を複製します。

以下に説明するio.clientsを使用する別の方法もありますが、私はその方法を使用していません。

その他の解決策: socket.ioおよびnode.jsを使用して特定のクライアントにメッセージを送信

0
jsb

使ってみましたか?

var socket = io.connect('http://localhost:80/');
0
Mario Mixtega