Node.jsサーバーでsocket.IOを使用する場合、着信接続のIPアドレスを取得する簡単な方法はありますか?標準のHTTP接続から取得できることは知っていますが、socket.ioは少し違うものです。
さて、0.7.7の時点でこれは利用可能ですが、lubarが説明する方法ではありません。私はこれを見つけるためにgitハブのいくつかのコミットログを解析する必要がありましたが、次のコードは実際に動作します。
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
バージョンを使用し、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 }
}
Edit:これは公式APIの一部ではないため、socket.ioの将来のリリースでの動作が保証されないことに注意してください。
この関連リンクも参照してください: engine.io issue
Socket.IOのバージョン0.7.7は、クライアントのIPアドレスを返すと主張しています。私は成功しました:
var socket = io.listen(server);
socket.on('connection', function (client) {
var ip_address = client.connection.remoteAddress;
}
Socket.ioのソースコードを読むと、「listen」メソッドは引数(server、options、fn)を取り、「server」がHTTP/Sサーバーのインスタンスである場合、単純にラップしているように見えます。
したがって、おそらく「connection」イベントをリッスンし、ソケット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));
Socket.ioにパッチを送信する方が簡単な場合があります。この場合、接続時に割り当てられたremoteAddressプロパティで独自のSocketオブジェクトが拡張されます...
これはうまくいくようです:
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を使用して、Wordアドレスを検索します。最後に、フィールドremoteAddressが見つかったら、ドットを使用してデータをフィルタリングします。私の場合は
console.log(socket.conn.remoteAddress);
Socket.ioで2.:使用できます:
socket.conn.transport.socket._socket.remoteAddress
transports: ['websocket']
で動作します
Socket.handshake.headers内にforwarded forアドレスがあり、これがローカルマシンに表示されないことがわかりました。そして、私は次を使用してリモートアドレスを取得することができました:
socket.handshake.headers['x-forwarded-for']
これはクライアント側ではなくサーバー側にあります。
socket.io
1.3.4では、次の可能性があります。
socket.handshake.address
、
socket.conn.remoteAddress
または
socket.request.client._peername.address
最新バージョンは以下で動作します:
console.log(socket.handshake.address);
socket.request.connection.remoteAddress
を使用します
1.3.5で:
var clientIP = socket.handshake.headers.Host;