При использовании socket.IO на сервере Node.js, есть ли простой способ получить IP-адрес входящее соединение? Я знаю, что вы можете получить его через стандартное HTTP-соединение, но socket.io - это немного другое дело.
Добро пожаловать в 2019, где машинописный текст медленно принимает мир. Другие ответы все еще совершенно действительны. Однако я просто хотел показать Вам, как можно настроить это во введенной среде.
В случае, если Вы еще не имеете. Необходимо сначала установить некоторые зависимости (т.е. от командной строки: 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"
}
я определил импорт с помощью импорта ES6 (который необходимо включить в Вашем tsconfig.json
файл сначала.)
import * as SocketIO from "socket.io";
import * as http from "http";
import * as https from "https";
import * as express from "express";
, поскольку я использую машинописный текст, у меня есть полный ввод теперь на всем, я делаю с этими объектами.
Так, очевидно, сначала Вам нужен http сервер:
const handler = express();
const httpServer = (useHttps) ?
https.createServer(serverOptions, handler) :
http.createServer(handler);
я предполагаю, что Вы уже сделали все это. И Вы, вероятно, уже добавили сокет io к нему:
const io = SocketIO(httpServer);
httpServer.listen(port, () => console.log("listening") );
io.on('connection', (socket) => onSocketIoConnection(socket));
Затем, для обработки новых соединений сокета-io, можно поместить эти SocketIO.Socket
тип на его параметре.
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(...));
}
И затем наконец, потому что у нас есть полный ввод теперь, мы можем легко получить IP от нашего сокета без предположения:
const ip = socket.conn.remoteAddress;
console.log(`client ip: ${ip}`);
В версии v2.3.0
эта работа для меня:
socket.handshake.headers['x-forwarded-for'].split(',')[0]