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.
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);
});
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);
});
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 swoimproxy_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.
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);
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']);
}
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
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;
}
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);
});
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);
});
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.
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...
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);
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']
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
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]
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
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);
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}`);
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.
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;
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