socket.io 에서 클라이언트의 IP 주소 가져오기
소켓 사용시.Node.js 서버의 IO, 들어오는 연결의 IP 주소를 쉽게 얻을 수 있는 방법이 있습니까?표준 HTTP 연결을 통해 얻을 수 있다는 것을 알고 있지만 socket.io 은 좀 다른 종류입니다.
좋아요, 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.0.4의 경우:
io.sockets.on('connection', function (socket) {
var socketId = socket.id;
var clientIp = socket.request.connection.remoteAddress;
console.log(clientIp);
});
다른 서버를 역방향 프록시로 사용하는 경우, 언급된 모든 필드에 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
그리고 내 앱을 온(on)으로 배포합니다.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']);
}
이것은 2.3.0 버전에서 작동합니다.
io.on('connection', socket => {
const ip = socket.handshake.headers['x-forwarded-for'] || socket.conn.remoteAddress.split(":")[3];
console.log(ip);
});
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 의 향후 릴리스에서 작동할 것을 보장하지 않습니다.
소켓 버전 0.7.7.7입니다.IO는 이제 클라이언트의 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);
});
아주 쉽습니다.퍼스트 퍼트
io.sockets.on('connection', function (socket) {
console.log(socket);
소켓의 모든 필드가 표시됩니다.그런 다음 CTRL+F를 사용하여 주소라는 단어를 검색합니다.마지막으로 remoteAddress 필드를 찾으면 점을 사용하여 데이터를 필터링합니다.나 같은 경우는
console.log(socket.conn.remoteAddress);
나는 소켓 안에서 그것을 발견했습니다. 악수.내 로컬 컴퓨터에 나타나지 않는 주소에 대해 전달된 헤더가 있습니다.그리고 다음을 이용해 원격 주소를 얻을 수 있었던 방법은 다음과 같습니다.
socket.handshake.headers['x-forwarded-for']
이것은 서버측에 있고 클라이언트측에 있지 않습니다.
v2.3.0 버전
나를 위한 이 일 :
socket.handshake.headers['x-forwarded-for'].split(',')[0]
socket.io 소스 코드를 읽어보면 "listen" 메서드는 인수(server, options, fn)를 사용하는 것으로 보이며 "server"가 HTTP/S 서버의 인스턴스인 경우 간단히 랩핑합니다.
따라서 아마도 '연결' 이벤트를 수신하고 소켓 remoteAddress를 처리하는 빈 서버를 제공할 수 있습니다. 그러나 해당 주소를 실제 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));
연결 시 할당된 remoteAddress 속성으로 자체 소켓 개체가 확장되는 패치를 socket.io 에 제출하는 것이 더 쉬울 수 있습니다.
위에socket.io
과 같은 1.3.4다.
socket.handshake.address
,
socket.conn.remoteAddress
아니면
socket.request.client._peername.address
socket.io 2.0에서 다음을 사용할 수 있습니다.
socket.conn.transport.socket._socket.remoteAddress
와 함께 transports: ['websocket']
블로그 게시물을 훑어보고 심지어 사람들이 그 질문에 대한 답도 했습니다.
나는 노력했다.socket.handshake.address
작동은 했지만 접두사는 ::fffff:입니다.
그걸 제거하기 위해 regex를 사용해야 했습니다.
버전 4.0.1에서 작동합니다.
socket.conn.remoteAddress
타이프스크립트가 서서히 세계를 점령하는 2019년을 환영합니다.다른 대답들은 여전히 완벽하게 유효합니다.하지만, 저는 여러분이 어떻게 이것을 타이핑된 환경에서 설정할 수 있는지 보여주고 싶었을 뿐입니다.
아직 못 봤을 때.먼저 몇 가지 종속성(예: 명령줄)을 설치해야 합니다.
"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 imports(파일에서 먼저 활성화해야 함)를 사용하여 Imports를 정의했습니다.
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);
당신은 이미 그 모든 것을 했었나 봐요.아마도 이미 소켓 아이오를 추가했을 것입니다.
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}`);
클라이언트의 IP 주소를 가져오는 방법(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();
그리고 작동하는지 확인하려면 geoplugin.net/json.gsp?ip=로 이동하여 링크의 IP를 전환해야 합니다.그렇게 한 후에는 고객의 정확한 위치를 알려줄 것이고, 이는 작동했다는 것을 의미합니다.
사용하다socket.request.connection.remoteAddress
최신 버전은 다음과 함께 작동합니다.
console.log(socket.handshake.address);
나 같은 경우에는
나는 나의 것을 바꿉니다.
app.configure(socketio)
로.
app.configure(socketio(function(io) {
io.use(function (socket, next) {
socket.feathers.clientIP = socket.request.connection.remoteAddress;
next();
});
}));
저는 이렇게 ip를 받을 수 있습니다.
function checkIP() {
return async context => {
context.data.clientIP = context.params.clientIP
}
}
module.exports = {
before: {
all: [],
find: [
checkIp()
]}
}
1.3.5에서:
var clientIP = socket.handshake.headers.host;
언급URL : https://stackoverflow.com/questions/6458083/get-the-clients-ip-address-in-socket-io
'programing' 카테고리의 다른 글
bootstrap jquery show.bs . modal 이벤트가 발생하지 않습니다. (0) | 2023.10.13 |
---|---|
"시스템 호출 차단"이란 무엇을 의미합니까? (0) | 2023.10.13 |
jQuery - 요소에 클래스가 있는 경우 이렇게 합니다. (0) | 2023.10.13 |
구글 분석 API의 게시물에 대한 서버 응답 상태를 얻는 방법 또는 404 상태의 페이지를 필터링하는 방법은 무엇입니까? (0) | 2023.10.13 |
MySQL 테이블 이름의 밑줄이 문제를 일으키나요? (0) | 2023.10.13 |