Uzyskać adres IP klienta w socket.io

Podczas stosowania socket.IO w węźle.js server, czy istnieje łatwy sposób na uzyskanie adresu IP połączenia przychodzącego? Wiem, że można go uzyskać ze standardowego połączenia HTTP, ale socket.io to trochę inna bestia.

Author: Fund Monica's Lawsuit, 2011-06-23

20 answers

Ok, od 0.7.7 jest to dostępne, ale nie w sposób, który opisuje lubar. Skończyło się na tym, że musiałem przeanalizować niektóre logi commitów w git hub, aby to zrozumieć, ale poniższy kod naprawdę działa dla mnie teraz:

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);
});
 163
Author: Toji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-25 14:19:39

Dla 1.0.4:

io.sockets.on('connection', function (socket) {
  var socketId = socket.id;
  var clientIp = socket.request.connection.remoteAddress;

  console.log(clientIp);
});
 74
Author: flatroze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-25 14:19:00

Jeśli używasz innego serwera jako odwrotnego serwera proxy, wszystkie wymienione pola będą zawierały localhost. Najprostszym obejściem jest dodanie nagłówków ip / port w serwerze proxy.

Przykład dla nginx: dodaj to po swoim proxy_pass:
proxy_set_header  X-Real-IP $remote_addr;
proxy_set_header  X-Real-Port $remote_port;

Dzięki temu Nagłówki będą dostępne w socket.io serwer węzła:

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 dla mnie Wersja 1.4.6.

 49
Author: zuim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-27 03:12:06

Dla najnowszych socket.io użycie wersji

socket.request.connection.remoteAddress

Na przykład:

var socket = io.listen(server);
socket.on('connection', function (client) {
  var client_ip_address = socket.request.connection.remoteAddress;
}

Uwaga, poniższy kod zwraca adres IP serwera, a nie Adres IP klienta

var address = socket.handshake.address;
console.log('New connection from ' + address.address + ':' + address.port);
 21
Author: SlyBeaver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-25 14:18:42

Korzystając z najnowszej wersji 1.0.6 Socket.IO i mam zainstalowaną aplikację na Heroku, dostaję klienta IP i port używając headers do socket 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']);

}
 8
Author: Balthazar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-28 19:11:46

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

Edit : zauważ, że nie jest to część oficjalnego API, a zatem nie gwarantuje działania w przyszłych wydaniach socket.io.

Zobacz też ten odnośnik : engine.io wydanie

 6
Author: nha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-25 14:17:51

Wersja 0.7.7 z Socket.IO teraz twierdzi, że zwraca adres IP klienta. Udało mi się:

var socket = io.listen(server);
socket.on('connection', function (client) {
  var ip_address = client.connection.remoteAddress;
}
 6
Author: lubar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-25 14:18:08

To działa na 2.3.0 wersja:

io.on('connection', socket => {
   const ip = socket.handshake.headers['x-forwarded-for'] || socket.conn.remoteAddress.split(":")[3];
   console.log(ip);
});
 5
Author: Diogo Capela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-11 12:14:41

To chyba 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);
});
 4
Author: Robert Larsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-19 10:11:29

Znalazłem to w gniazdku.uścisk dłoni.nagłówki istnieje przekazywany na adres , który nie pojawia się na mojej lokalnej maszynie. I udało mi się uzyskać zdalny adres używając:

socket.handshake.headers['x-forwarded-for']

To jest po stronie serwera, a nie po stronie klienta.

 4
Author: Ufb007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-23 10:37:41

Od czytania socket.io kod źródłowy wygląda na to, że metoda "listen" pobiera argumenty (serwer, opcje, fn) i jeśli "server" jest instancją serwera HTTP/S, to po prostu owinie go za Ciebie.

Więc prawdopodobnie możesz dać mu pusty serwer, który nasłuchuje zdarzenia 'connection' i obsługuje socket remoteAddress; jednak, rzeczy mogą być bardzo trudne, jeśli trzeba powiązać ten adres z rzeczywistym socket.io obiekt gniazda.

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ć łatwiej prześlij łatkę do socket.io w którym ich własny obiekt Socket jest rozszerzony o właściwość remoteAddress przypisaną w czasie połączenia...

 3
Author: maerics,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-23 18:29:14

Bardzo proste. First put

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

console.log(socket.conn.remoteAddress);
 3
Author: geniant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-25 14:17:33

W socket.io 2.0: można użyć:

socket.conn.transport.socket._socket.remoteAddress

Współpracuje z transports: ['websocket']

 3
Author: Chris',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-31 18:21:14

Na socket.io 1.3.4 masz następujące możliwości.

socket.handshake.address,

socket.conn.remoteAddress lub

socket.request.client._peername.address

 2
Author: Yaki Klein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-07 11:38:08

W wersji v2.3.0

Ta praca dla mnie:

socket.handshake.headers['x-forwarded-for'].split(',')[0]
 2
Author: Rizuwan Intercooler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-12 19:50:40

Użyj socket.request.connection.remoteAddress

 1
Author: DuckHunter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-25 05:37:32

Najnowsza wersja działa z:

console.log(socket.handshake.address);
 1
Author: Khanasyubighi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-29 11:39:38

Witamy w 2019 roku, gdzie maszynopis powoli przejmuje kontrolę nad światem. Inne odpowiedzi są nadal w pełni poprawne. Chciałem jednak pokazać, jak można to skonfigurować w środowisku wpisanym na maszynie.

Na wypadek, gdybyś jeszcze tego nie zrobił. Najpierw powinieneś zainstalować pewne zależności (tj. z wiersza 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 używając ES6 imports (który powinieneś włączyć w swoim pliku tsconfig.json.)

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 pełne typowanie teraz, na wszystko, co robię z tymi przedmiotami.

Więc oczywiście najpierw potrzebny jest serwer http:

const handler = express();

const httpServer = (useHttps) ?
  https.createServer(serverOptions, handler) :
  http.createServer(handler);
Chyba już to zrobiłeś. I pewnie już dodałeś do niego socket io:
const io = SocketIO(httpServer);
httpServer.listen(port, () => console.log("listening") );
io.on('connection', (socket) => onSocketIoConnection(socket));

Następny, do obsługi nowych połączeń socket-io, możesz umieścić typ SocketIO.Socket na 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}`);
 1
Author: bvdb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-08 09:19:59

Oto jak uzyskać adres ip klienta (v 3.1.0):


// Current Client
const ip = socket.handshake.headers["x-forwarded-for"].split(",")[1].toString().substring(1, this.length);
// Server 
const ip2 = socket.handshake.headers["x-forwarded-for"].split(",")[0].toString();

I aby sprawdzić czy działa przejdź do geoplugin.net/json.gsp?ip= po prostu upewnij się, aby przełączyć ip w link. Po tym, jak to zrobisz, powinno dać ci dokładną lokalizację klienta, co oznacza, że działało.

 1
Author: Fus_ion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-28 23:40:08

W 1.3.5:

var clientIP = socket.handshake.headers.host;
 -1
Author: Syscall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-18 18:05:03