Socket.IOでクライアントのヘッダー情報 (IPアドレスやuser-agent等) を取得

Socket.IOで接続してきたクライアントの情報、特にIPアドレスやブラウザの種類を知りたい場合がありますので、コードを書いてみました。

簡単に言えばサーバー側の「socket.handshake」にクライアントの情報が格納されています。

具体的には以下のようなコードになります。

# 適当なディレクトリを作って移動
$ mkdir socketio-clientinfo
$ cd socketio-clientinfo

# サーバー側のコードを記述
# (このページの下の方にコードが載っています)
$ vi app.js

# クライアント側のコードを記述
# (このページの下の方にコードが載っています)
$ mkdir public
$ vi public/index.html

# node.jsを起動
# (express、socket.io等必要なライブラリをインストールしておいてください)
$ node app.js

# ブラウザでアクセス
# (サーバーのIPアドレスにブラウザでアクセスしてください)

# クライアントの情報が表示されます
# (↓ではx.x.x.xとy.y.y.yと伏せ字にしています)
{"headers":{"host":"x.x.x.x","connection":"keep-alive","user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36","accept":"*/*","referer":"http://x.x.x.x/","accept-encoding":"gzip,deflate,sdch","accept-language":"en-US,en;q=0.8","cookie":"io=q__i7X_BElMqbzF8AAAA"},"time":"Mon Jan 19 2015 13:47:21 GMT+0900 (JST)","address":"y.y.y.y","xdomain":false,"secure":false,"issued":1421642841412,"url":"/socket.io/?EIO=3&transport=polling&t=1421642811567-20","query":{"EIO":"3","transport":"polling","t":"1421642811567-20"}}

{"headers":{"host":"x.x.x.x","connection":"keep-alive","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36","accept":"*/*","referer":"http://x.x.x.x/","accept-encoding":"gzip, deflate, sdch","accept-language":"en-US,en;q=0.8,ja;q=0.6","cookie":"io=i0EO-Tv4njOhQRnVAAAB"},"time":"Mon Jan 19 2015 13:47:24 GMT+0900 (JST)","address":"y.y.y.y","xdomain":false,"secure":false,"issued":1421642844308,"url":"/socket.io/?EIO=3&transport=polling&t=1421642687594-21","query":{"EIO":"3","transport":"polling","t":"1421642687594-21"}}

app.js
var express = require('express');
var app = express();
var http = require('http');
var server = http.createServer(app).listen(80);
var io = require('socket.io')(server);
app.use(express.static(__dirname + '/public'));
console.log('Access to http://localhost:80/');
 
io.on('connection', function (socket) {
    console.log(JSON.stringify(socket.handshake));
});

index.html (IPアドレスは、サーバーのIPアドレスに書き換えてください)
<body>

<h2>Socket.IOで接続してきたクライアントのヘッダー(IPアドレスやユーザーエージェント等)をサーバー側で取得</h2>
<p>サーバー側のターミナルで確認して下さい。このHTMLはSocket.IOに接続するだけの役割です。</p>

<!-- ==================== Socket.IO ==================== -->
<script src="socket.io/socket.io.js"></script>
<script>
var socket = io.connect("192.168.111.111:80");
</script>

</body>