Używając socket.IO na serwerze Node.js, czy istnieje łatwy sposób na uzyskanie adresu IP połączenia przychodzącego? Wiem, że możesz to uzyskać ze standardowego połączenia HTTP, ale socket.io to trochę inna bestia.
node.js
ip-address
socket.io
Toji
źródło
źródło
console.dir(socket)
może o to chodziłoOdpowiedzi:
OK, od wersji 0.7.7 jest to dostępne, ale nie w sposób opisany przez Lubar. Skończyło się na tym, że musiałem przeanalizować niektóre dzienniki zatwierdzeń w git hub, aby to zrozumieć, ale następujący kod faktycznie teraz działa dla mnie:
var io = require('socket.io').listen(server); io.sockets.on('connection', function (socket) { var address = socket.handshake.address; console.log('New connection from ' + address.address + ':' + address.port); });
źródło
1.3.7
, to powraca::ffff:127.0.0.1
socket.request.connection.remoteAddress
dla wersji 1.xdla 1.0.4:
io.sockets.on('connection', function (socket) { var socketId = socket.id; var clientIp = socket.request.connection.remoteAddress; console.log(clientIp); });
źródło
socket.request.connection.remoteAddress
isocket.request.connection.remotePort
pracuj dla mnie. Jednak gdy próbowałem, nie widziałem żadnej z tych właściwości:console.log(util.inspect(socket.request.connection, {showHidden: true, colors: true}));
Dlaczego nie?1.3.7
zwraca to::ffff:127.0.0.1
Jeśli używasz innego serwera jako zwrotnego proxy, wszystkie wymienione pola będą zawierać localhost. Najłatwiejszym sposobem obejścia tego problemu jest dodanie nagłówków adresu IP / portu na serwerze proxy.
Przykład dla nginx: dodaj to po
proxy_pass
:Spowoduje to udostępnienie nagłówków na serwerze węzła socket.io:
var ip = socket.handshake.headers["x-real-ip"]; var port = socket.handshake.headers["x-real-port"];
Zauważ, że nagłówek jest wewnętrznie konwertowany na małe litery.
Jeśli łączysz serwer węzła bezpośrednio z klientem,
var ip = socket.conn.remoteAddress;
działa z socket.io w wersji 1.4.6 dla mnie.
źródło
Aby uzyskać najnowszą wersję socket.io, użyj
Na przykład:
var socket = io.listen(server); socket.on('connection', function (client) { var client_ip_address = socket.request.connection.remoteAddress; }
uważaj, poniższy kod zwraca adres IP serwera, a nie klienta
var address = socket.handshake.address; console.log('New connection from ' + address.address + ':' + address.port);
źródło
Korzystając z najnowszej
1.0.6
wersjiSocket.IO
i mam wdrożoną aplikacjęHeroku
, otrzymuję klientaIP
iport
używamheaders
go wsocket handshake
:var socketio = require('socket.io').listen(server); socketio.on('connection', function(socket) { var sHeaders = socket.handshake.headers; console.info('[%s:%s] CONNECT', sHeaders['x-forwarded-for'], sHeaders['x-forwarded-port']); }
źródło
Od socket.io 1.1.0 używam:
io.on('connection', function (socket) { console.log('connection :', socket.request.connection._peername); // connection : { address: '192.168.1.86', family: 'IPv4', port: 52837 } }
Edycja : Zwróć uwagę, że nie jest to część oficjalnego interfejsu API, a zatem nie ma gwarancji, że będzie działać w przyszłych wydaniach socket.io.
Zobacz także ten odpowiedni link: problem z engine.io
źródło
Wersja 0.7.7 Socket.IO twierdzi teraz, że zwraca adres IP klienta. Odniosłem sukces z:
var socket = io.listen(server); socket.on('connection', function (client) { var ip_address = client.connection.remoteAddress; }
źródło
To wydaje się działać:
var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { var endpoint = socket.manager.handshaken[socket.id].address; console.log('Client connected from: ' + endpoint.address + ":" + endpoint.port); });
źródło
127.0.0.1
za mnie, a nie adres IP klienta (node.js działa na serwerze zdalnym).Odkryłem, że w pliku socket.handshake.headers jest plik przekierowany adres, który nie pojawia się na moim komputerze lokalnym. I udało mi się uzyskać zdalny adres za pomocą:
socket.handshake.headers['x-forwarded-for']
Jest to po stronie serwera, a nie klienta.
źródło
::ffff:127.0.0.1
ale to dało mi rzeczywisty adres IPPo odczytaniu kodu źródłowego socket.io wygląda na to, że metoda „Listen” pobiera argumenty (serwer, opcje, fn) i jeśli „serwer” jest instancją serwera HTTP / S, po prostu ją za ciebie zapakuje.
Można więc przypuszczalnie dać mu pusty serwer, który nasłuchuje zdarzenia „connection” i obsługuje gniazdo remoteAddress; Jednak sytuacja może być bardzo trudna, jeśli trzeba skojarzyć ten adres z rzeczywistym obiektem gniazda socket.io.
var http = require('http') , io = require('socket.io'); io.listen(new http.Server().on('connection', function(sock) { console.log('Client connected from: ' + sock.remoteAddress); }).listen(80));
Może być łatwiejsze przesłanie poprawki do socket.io, w którym ich własny obiekt Socket jest rozszerzony o właściwość remoteAddress przypisaną w czasie połączenia ...
źródło
Bardzo łatwe. Pierwsze włożenie
io.sockets.on('connection', function (socket) { console.log(socket);
Zobaczysz wszystkie pola gniazda. następnie użyj CTRL + F i wyszukaj słowo adres. Wreszcie, gdy znajdziesz pole remoteAddress, użyj kropek do filtrowania danych. w moim przypadku tak
console.log(socket.conn.remoteAddress);
źródło
W socket.io 2.0 : możesz użyć:
socket.conn.transport.socket._socket.remoteAddress
pracuje z
transports: ['websocket']
źródło
Działa to dla najnowszej wersji 2.3.0 :
io.on('connection', socket => { const ip = socket.handshake.headers[x-forwarded-for] || socket.conn.remoteAddress.split(":")[3]; console.log(ip); });
źródło
w
socket.io
1.3.4 masz następujące możliwości.socket.handshake.address
,socket.conn.remoteAddress
lubsocket.request.client._peername.address
źródło
W wersji v2.3.0
ta praca dla mnie:
socket.handshake.headers['x-forwarded-for'].split(',')[0]
źródło
posługiwać się
socket.request.connection.remoteAddress
źródło
1.3.7
, zwraca to::ffff:127.0.0.1
Najnowsza wersja współpracuje z:
console.log(socket.handshake.address);
źródło
1.3.7
zwraca to::ffff:127.0.0.1
0.0.0.0
. Związane z: stackoverflow.com/a/37378670/5138796Witamy w 2019 roku, kiedy maszynopis powoli przejmuje świat. Inne odpowiedzi są nadal całkowicie aktualne. Chciałem jednak tylko pokazać, jak można to ustawić w środowisku pisania.
Na wypadek, gdybyś jeszcze tego nie zrobił. Najpierw należy zainstalować pewne współzależności (czyli z linii poleceń:
npm install <dependency-goes-here> --save-dev
)"devDependencies": { ... "@types/express": "^4.17.2", ... "@types/socket.io": "^2.1.4", "@types/socket.io-client": "^1.4.32", ... "ts-node": "^8.4.1", "typescript": "^3.6.4" }
Zdefiniowałem import za pomocą importu ES6 (który powinieneś najpierw włączyć w swoim
tsconfig.json
pliku).import * as SocketIO from "socket.io"; import * as http from "http"; import * as https from "https"; import * as express from "express";
Ponieważ używam maszynopisu, mam teraz pełne pisanie na wszystkim, co robię z tymi obiektami.
Więc oczywiście najpierw potrzebujesz serwera http:
const handler = express(); const httpServer = (useHttps) ? https.createServer(serverOptions, handler) : http.createServer(handler);
Chyba już to wszystko zrobiłeś. I pewnie już dodałeś do niego gniazdo io:
const io = SocketIO(httpServer); httpServer.listen(port, () => console.log("listening") ); io.on('connection', (socket) => onSocketIoConnection(socket));
Następnie, w celu obsługi nowych połączeń typu socket-io, możesz umieścić
SocketIO.Socket
typ w jego parametrze.function onSocketIoConnection(socket: SocketIO.Socket) { // I usually create a custom kind of session object here. // then I pass this session object to the onMessage and onDisconnect methods. socket.on('message', (msg) => onMessage(...)); socket.once('disconnect', (reason) => onDisconnect(...)); }
I wreszcie, ponieważ mamy teraz pełne wpisywanie, możemy łatwo pobrać ip z naszego gniazda, bez zgadywania:
const ip = socket.conn.remoteAddress; console.log(`client ip: ${ip}`);
źródło
W 1.3.5:
var clientIP = socket.handshake.headers.host;
źródło
1.3.7
zwraca to adres URL strony, a nie adres IP