webentwicklung-frage-antwort-db.com.de

Senden einer Nachricht an einen bestimmten Client mit socket.io und leerer Nachrichtenwarteschlange

Ich werde verrückt mit socket.io! Dokumentation ist so schlecht, dass sie einfach nicht stimmt.

Ich möchte eine Rückmeldung an einen bestimmten Client über socket.io senden

Meine Serverseite sieht so aus:

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');
    });
});

und die clientseite sieht so aus:

$(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);
    });
});

aber der kunde macht einfach nichts. Ich habe fast alles versucht. Kann mir jemand sagen, was ich falsch mache, bitte! :(

36
Valeri K

um eine Nachricht an einen bestimmten Client zu senden, speichern Sie alle, die sich mit dem Server in einem Objekt verbinden.

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

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

dann kannst du später so etwas machen:

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

Es gibt verschiedene Möglichkeiten, Feedback über socket.io an einen bestimmten Client zu senden:

  • Speichern Sie, wie von pkyeck angegeben, alle Clients in einem Objekt, sodass Sie diese spezifischen Clients später in Ihren Routenhandlern senden können, z.

    var sessionsConnections = {};
    sio.on('connection', function (socket) {
      // do all the session stuff
      sessionsConnections[socket.handshake.sessionID] = socket;
    });
    
  • oder verwenden Sie die integrierte Unterstützung von socket.io für Räume. Abonnieren Sie jeden Client für einen Verbindungsraum und senden Sie ihn über diesen Raum innerhalb von Routenabwicklern, z.

    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!');
    });
    

Wissen:

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

Beachten Sie, dass diese beiden Beispiellösungen davon ausgehen, dass socket.io und express so konfiguriert wurden, dass sie den gleichen Sitzungsspeicher verwenden und daher auf dieselben Sitzungsobjekte verweisen. Siehe die Links oben und unten für weitere Details, um dies zu erreichen:

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

18
Tom Rogers

2 Dinge

1) Sie sollten Ihre io.sockets.on(..) wirklich außerhalb Ihrer app/update-Route platzieren, um das Hinzufügen mehrerer Listener für Clients zu verhindern.

2) io.sockets.socket (id); sollte nicht verwendet werden, es hätte socket.emit('new', 'hello') sein sollen

7
3rdEden

In socket.io 1.0 würde es so funktionieren. Es kann für niedrigere Versionen funktionieren, aber ich kann es nicht garantieren.

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

Dies funktioniert, weil socket.io automatisch einen Socket zu einem Raum hinzufügt, dessen ID sich bei der Verbindung befindet.

Wenn Sie ein Upgrade auf Version 1.0 planen, gibt es viele Änderungen an der API, sodass Sie gelegentlich Code ändern müssen, damit er in 1.0 funktioniert.

5
Ferdi265

Der richtige Weg, dies in Socket.io 1.0+ zu tun, ist:

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

Sie können auch einen Raumnamen für 'users_socket_id' verwenden, um einen bestimmten Socket.io-Raum auszugeben.

4
Williz

Erstens können Sie socket.id nicht clientseitig verwenden.

Und dann die Zeile ändern

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

zu

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

2
Shekhar

ich bin müde mit der neuesten Version von node und socket.io. Unten werde ich den kompletten Code posten

  <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>

serverseitiger Code

  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

Ich glaube, io.sockets.socket wurde entfernt und war ein Problem in Socket.IO ( https://github.com/socketio/socket.io/issues/1618 ).

Sie können io.sockets.connected [socket.id] verwenden und die socket.id speichern, um über den Benutzernamen auf den Benutzer zu verweisen:

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

Ich sehe es nirgendwo in der Dokumentation, also kann ich sehen, wie das nicht beantwortet wurde. Wenn Sie keine Referenz über Benutzernamen haben, können Sie stattdessen Folgendes versuchen:

users[socket.id] = socket.id;

um den Schlüssel und den Wert für einen einfachen Zugriff zu duplizieren.

Es gibt möglicherweise auch eine andere Möglichkeit, io.clients wie unten beschrieben zu verwenden, aber ich habe diese Methode nicht verwendet.

ANDERE LÖSUNG: Nachricht an bestimmte Clients mit socket.io und node.js senden

0
jsb

Hast du es probiert?

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