Node.js 서버에서 socket.IO를 사용할 때 들어오는 연결의 IP 주소를 얻는 쉬운 방법이 있습니까? 표준 HTTP 연결에서 얻을 수 있다는 것을 알고 있지만 socket.io는 약간 다른 짐승입니다.
console.dir(socket)
당신이 의도 한 것일 수도 있습니다
Node.js 서버에서 socket.IO를 사용할 때 들어오는 연결의 IP 주소를 얻는 쉬운 방법이 있습니까? 표준 HTTP 연결에서 얻을 수 있다는 것을 알고 있지만 socket.io는 약간 다른 짐승입니다.
console.dir(socket)
당신이 의도 한 것일 수도 있습니다
답변:
0.7.7부터는 루바가 설명하는 방식으로 사용할 수 없지만 사용할 수 있습니다. 나는 이것을 알아 내기 위해 git hub의 커밋 로그를 파싱해야했지만 결국 다음 코드가 실제로 작동합니다.
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);
});
1.3.7
, 이것은 다음을 반환합니다::ffff:127.0.0.1
socket.request.connection.remoteAddress
1.x 버전 용
1.0.4의 경우 :
io.sockets.on('connection', function (socket) {
var socketId = socket.id;
var clientIp = socket.request.connection.remoteAddress;
console.log(clientIp);
});
socket.request.connection.remoteAddress
그리고 socket.request.connection.remotePort
나를 위해 작동합니다. 그러나 시도했을 때 이러한 속성 중 하나가 나열 console.log(util.inspect(socket.request.connection, {showHidden: true, colors: true}));
되지 않았습니다.
1.3.7
, 이것은 다음을 반환합니다::ffff:127.0.0.1
다른 서버를 리버스 프록시로 사용하는 경우 언급 된 모든 필드에 localhost가 포함됩니다. 가장 쉬운 해결 방법은 프록시 서버에서 ip / port에 대한 헤더를 추가하는 것입니다.
nginx의 예 : 다음에 이것을 추가하십시오 proxy_pass
:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
그러면 socket.io 노드 서버에서 헤더를 사용할 수 있습니다.
var ip = socket.handshake.headers["x-real-ip"];
var port = socket.handshake.headers["x-real-port"];
헤더는 내부적으로 소문자로 변환됩니다.
노드 서버를 클라이언트에 직접 연결하는 경우
var ip = socket.conn.remoteAddress;
socket.io 버전 1.4.6에서 작동합니다.
최신 socket.io 버전 사용
socket.request.connection.remoteAddress
예를 들면 다음과 같습니다.
var socket = io.listen(server);
socket.on('connection', function (client) {
var client_ip_address = socket.request.connection.remoteAddress;
}
아래 코드는 클라이언트의 IP가 아닌 서버의 IP를 반환합니다.
var address = socket.handshake.address;
console.log('New connection from ' + address.address + ':' + address.port);
의 최신 1.0.6
버전을 사용하고에 Socket.IO
응용 프로그램을 배포 Heroku
하면 클라이언트 IP
를 port
사용하여 다음 headers
을 사용합니다 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']);
}
socket.io 1.1.0부터 다음을 사용합니다.
io.on('connection', function (socket) {
console.log('connection :', socket.request.connection._peername);
// connection : { address: '192.168.1.86', family: 'IPv4', port: 52837 }
}
편집 : 이것은 공식 API의 일부가 아니므로 향후 socket.io 릴리스에서 작동하지 않을 수도 있습니다.
또한 관련 링크를 참조하십시오 : engine.io 문제
Socket.IO 버전 0.7.7은 이제 클라이언트의 IP 주소를 반환한다고 주장합니다. 나는 성공했다 :
var socket = io.listen(server);
socket.on('connection', function (client) {
var ip_address = client.connection.remoteAddress;
}
이것은 작동하는 것 같습니다 :
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);
});
127.0.0.1
클라이언트의 IP가 아닌 항상 나를 위해 돌아옵니다 (node.js는 원격 서버에서 실행됩니다).
socket.handshake.headers 내에 로컬 컴퓨터에 나타나지 않는 전달 된 주소 가 있음을 발견했습니다 . 그리고 다음을 사용하여 원격 주소를 얻을 수있었습니다.
socket.handshake.headers['x-forwarded-for']
이것은 클라이언트 측이 아닌 서버 측에 있습니다.
::ffff:127.0.0.1
나에게 실제 IP를 주었다
socket.io 소스 코드를 읽으면 "listen"메소드가 인수 (server, options, fn)를 취하는 것처럼 보이고 "server"가 HTTP / S 서버의 인스턴스 인 경우 간단히 랩핑합니다.
따라서 'connection'이벤트를 수신하고 소켓 remoteAddress를 처리하는 빈 서버를 제공 할 수 있습니다. 그러나 해당 주소를 실제 socket.io Socket 객체와 연결해야하는 경우 상황이 매우 어려울 수 있습니다.
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));
socket.io에 패치를 제출하는 것이 더 쉬울 수 있습니다. 여기에서 자체 소켓 객체는 연결시 할당 된 remoteAddress 속성으로 확장됩니다 ...
아주 쉽게. 먼저 넣어
io.sockets.on('connection', function (socket) {
console.log(socket);
소켓의 모든 필드를 볼 수 있습니다. 그런 다음 Ctrl + F를 사용하여 단어 주소를 검색하십시오. 마지막으로, remoteAddress 필드를 찾으면 점을 사용하여 데이터를 필터링하십시오. 내 경우에는
console.log(socket.conn.remoteAddress);
최신 버전은 다음과 호환됩니다.
console.log(socket.handshake.address);
1.3.7
, 이것은 다음을 반환합니다::ffff:127.0.0.1
0.0.0.0
. 관련 : stackoverflow.com/a/37378670/5138796
typescript가 천천히 세계를 점령하는 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));
다음으로 새로운 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}`);