Gibt es bei Verwendung von socket.IO auf einem Node.js-Server eine einfache Möglichkeit, die IP-Adresse einer eingehenden Verbindung abzurufen? Ich weiß, dass Sie es von einer Standard-HTTP-Verbindung erhalten können, aber socket.io ist ein etwas anderes Biest.
node.js
ip-address
socket.io
Toji
quelle
quelle
console.dir(socket)
könnte sein, was Sie meintenAntworten:
Okay, ab 0.7.7 ist dies verfügbar, aber nicht in der von lubar beschriebenen Weise. Am Ende musste ich einige Commit-Protokolle auf dem Git-Hub analysieren, um dies herauszufinden, aber der folgende Code funktioniert jetzt tatsächlich für mich:
quelle
1.3.7
kehrt dies zurück::ffff:127.0.0.1
socket.request.connection.remoteAddress
für 1.x Versionfür 1.0.4:
quelle
socket.request.connection.remoteAddress
undsocket.request.connection.remotePort
arbeite für mich. Beim Versuch habe ich jedoch keine dieser Eigenschaften aufgelistet:console.log(util.inspect(socket.request.connection, {showHidden: true, colors: true}));
Warum nicht?1.3.7
kehrt dies zurück::ffff:127.0.0.1
Wenn Sie einen anderen Server als Reverse-Proxy verwenden, enthalten alle genannten Felder localhost. Die einfachste Problemumgehung besteht darin, Header für IP / Port auf dem Proxyserver hinzuzufügen.
Beispiel für Nginx: Fügen Sie dies nach Ihrem
proxy_pass
:Dadurch werden die Header auf dem Knotenserver socket.io verfügbar:
Beachten Sie, dass der Header intern in Kleinbuchstaben konvertiert wird.
Wenn Sie den Knotenserver direkt mit dem Client verbinden,
funktioniert mit socket.io Version 1.4.6 für mich.
quelle
Für die neueste Version von socket.io verwenden
Beispielsweise:
Beachten Sie, dass der folgende Code die IP des Servers und nicht die IP des Clients zurückgibt
quelle
Mit der neuesten
1.0.6
Version vonSocket.IO
und der Bereitstellung meiner AppHeroku
erhalte ich den ClientIP
undport
verwende dasheaders
insocket handshake
:quelle
Seit socket.io 1.1.0 verwende ich:
Bearbeiten : Beachten Sie, dass dies nicht Teil der offiziellen API ist und daher in zukünftigen Versionen von socket.io nicht garantiert funktioniert.
Siehe auch diesen relevanten Link: engine.io issue
quelle
Version 0.7.7 von Socket.IO behauptet nun, die IP-Adresse des Clients zurückzugeben. Ich hatte Erfolg mit:
quelle
Das scheint zu funktionieren:
quelle
127.0.0.1
für mich immer zurück , nicht die IP des Clients (node.js wird auf dem Remote-Server ausgeführt).Ich habe festgestellt, dass in den socket.handshake.headers eine weitergeleitete Adresse vorhanden ist, die auf meinem lokalen Computer nicht angezeigt wird . Und ich konnte die entfernte Adresse erhalten mit:
Dies ist auf der Serverseite und nicht auf der Clientseite.
quelle
::ffff:127.0.0.1
aber dies gab mir die tatsächliche IPBeim Lesen des Quellcodes von socket.io sieht es so aus, als würde die Methode "listen" Argumente (Server, Optionen, fn) verwenden. Wenn "server" eine Instanz eines HTTP / S-Servers ist, wird sie einfach für Sie verpackt.
Sie könnten ihm also vermutlich einen leeren Server geben, der auf das Ereignis 'Verbindung' wartet und den Socket remoteAddress verarbeitet. Es kann jedoch sehr schwierig sein, diese Adresse einem tatsächlichen Socket.io-Socket-Objekt zuzuordnen.
Es könnte einfacher sein, einen Patch an socket.io zu senden, in dem das eigene Socket-Objekt um die zum Zeitpunkt der Verbindung zugewiesene Eigenschaft remoteAddress erweitert wird ...
quelle
Sehr leicht. Zuerst setzen
Sie sehen alle Socket-Felder. Verwenden Sie dann STRG + F und suchen Sie die Wortadresse. Wenn Sie das Feld remoteAddress finden, verwenden Sie Punkte, um Daten zu filtern. in meinem Fall ist es
quelle
In socket.io 2.0 : können Sie verwenden:
socket.conn.transport.socket._socket.remoteAddress
arbeitet mit
transports: ['websocket']
quelle
Dies funktioniert für die neueste Version 2.3.0 :
quelle
Am
socket.io
1.3.4 haben Sie folgende Möglichkeiten.socket.handshake.address
,socket.conn.remoteAddress
odersocket.request.client._peername.address
quelle
In Version v2.3.0
diese Arbeit für mich:
quelle
verwenden
socket.request.connection.remoteAddress
quelle
1.3.7
kehrt dies zurück::ffff:127.0.0.1
Neueste Version funktioniert mit:
quelle
1.3.7
kehrt dies zurück::ffff:127.0.0.1
0.0.0.0
. Siehe auchWillkommen im Jahr 2019, wo Typoskript langsam die Welt erobert. Andere Antworten sind immer noch vollkommen gültig. Ich wollte Ihnen jedoch nur zeigen, wie Sie dies in einer typisierten Umgebung einrichten können.
Falls Sie es noch nicht getan haben. Sie sollten zunächst einige Abhängigkeiten installieren (dh von der Kommandozeile:
npm install <dependency-goes-here> --save-dev
)Ich habe die Importe mithilfe von ES6-Importen definiert (die Sie zuerst in Ihrer
tsconfig.json
Datei aktivieren sollten .)Da ich Typoskript verwende, kann ich jetzt alles, was ich mit diesen Objekten mache, vollständig eingeben.
Natürlich benötigen Sie zuerst einen http-Server:
Ich denke du hast das alles schon getan. Und Sie haben wahrscheinlich bereits Socket Io hinzugefügt:
Als Nächstes können Sie für die Behandlung neuer Socket-Io-Verbindungen den
SocketIO.Socket
Typ in seinen Parameter einfügen.Und schließlich können wir, da wir jetzt vollständig tippen, die IP-Adresse problemlos aus unserem Socket abrufen, ohne zu raten:
quelle
In 1.3.5:
quelle
1.3.7
gibt diese Seite URL zurück, nicht ip