Wie sende ich am besten zusätzliche Daten bei Socket-Verbindung?
Klient:
socket.on('connect',function(){
//I'd like set some values and pass them up to the node server.
});
Node.js Server:
io.on('connection', function(client){
//I'd like to get the data here.
});
Zum Beispiel das Senden eines Benutzernamens oder einer E-Mail-Adresse usw.
socket.request.query
, aber das funktioniert bei mir auf socket.io v1.7.2 nicht. Muss auf jeden Fall verwendensocket.request._query
.socket.handshake.query
(über diese Antwort ) verwenden.{ query: "foo=bar", "bar=foo" }
wird nicht funktionieren.{query: 'var1='+foo+'&var2=bar'
Ich habe einen anderen Ansatz - sende ein Ereignis direkt nach dem Verbinden mit den Daten aus:
socket.on('connect',function(){ // Send ehlo event right after connect: socket.emit('ehlo', data); }); io.on('connection', function(client){ // Receive ehlo event with data: client.on('ehlo', function(data) { }); });
Sie können eine Variable / ein Objekt halten und sagen, wenn kein
ehlo
Ereignis mit Daten vorhanden ist, werden die anderen Ereignisse ignoriert, bis sieehlo
gesendet werden.Wenn dies nicht zufriedenstellend ist, können Sie Daten direkt beim Herstellen der Verbindung senden. Ich werde den Code nicht kopieren, aber er lautet in dieser Antwort: https://stackoverflow.com/a/13940399/1948292
quelle
socket.on('reconnect', …)
ob Ihr Server Daten benötigt, die nach einer Trennung möglicherweise nicht mehr bestehen bleiben.Die
connection
Ereignisse werden ausgelöst, sobald die TCP-Verbindung hergestellt ist. Es gibt keine Möglichkeit, etwas dazwischen zu senden.Sie können einfach die erste vom Server gesendete Nachricht nehmen und die Daten in diese Nachricht einfügen. Ich würde dringend empfehlen, ein dünnes Protokoll dafür zu erstellen, damit Sie mehrere Arten von Nachrichten haben und diese verwenden, um zu bestimmen, wie der Code die Daten verarbeiten soll.
Dies wäre auch erweiterbarer, da es ziemlich einfach ist, eine generische Architektur dafür zu entwickeln. Wenn Sie darauf warten möchten, dass das
userdata
zuerst eingeht, können Sie Ihren Verbindungen einfach einen Status hinzufügen.quelle
Dies ist mein Code zum Senden von Abfragedaten an nodejs und server.io Server Client
var socket = io.connect(window.location.origin,{query:'loggeduser=user1'}); io.sockets.on('connection', function (socket) { var endp = socket.manager.handshaken[socket.id].address; console.log("query... " + socket.manager.handshaken[socket.id].query.user); });
Abfrage ... Benutzer1
quelle
Ich fand die Antwort hier in dieser Hinsicht wirklich hilfreich: Benutzerdefinierte Daten zusammen mit handshakeData in socket.io senden?
Wenn Sie die folgende Dokumentation auffrischen, können Sie auch Möglichkeiten zum Verknüpfen von Variablen mit dem Handshake-Objekt erläutern, auf das während der Verbindung über das Socket-Objekt zugegriffen werden kann: https://github.com/LearnBoost/socket.io/wiki/Authorizing#global-authorization
quelle
Dies ist mein Code für Socket Version 2.1.1
//client side var socket = io.connect(window.location.origin,{query:'loggeduser=user1'}); // server side io.socket.on('connection', function (socket) { console.log("loggeduser => " + socket.handshake.query.loggeduser); });
quelle
Ich gehe davon aus, dass Sie SSL verwenden werden.
Die Verwendung von Querystrings zum Senden vertraulicher Daten ist keine gute Sicherheitspraxis ( warum? ). Ich denke, wenn Sie nicht sensible Daten senden müssen, ist die Antwort von Miquel die schnellste und einfachste. Wenn Sie jedoch sensible Daten senden müssen, ist so etwas wie Daniel W. der beste Ansatz.
Für einen Authentifizierungsansatz können Sie sich dieses Github-Projekt ( socketio-auth ) ansehen, das Ihnen über die Tatsache hinaus, dass es derzeit nicht gewartet wird, eine gute Vorstellung davon geben kann, wie Sie mit dem Problem umgehen können.
quelle