リモートIPアドレスの取得
サーバ側に接続してきたクライアントのIPアドレスを取得する方法。 サーバ側の構成によって、異なる方法があるとおもわれる。 thrift-0.8.0の場合。
TThreadPoolServerを改造する方法
ここではTThreadPoolServerを使用するものとし、それを改造する。
TThreadPoolServerのソースをまるまるコピーし、名前をMyThreadPoolServerとでもする。
(どこでも良いのだが)MyThreadPoolServerのstaticフィールドとして以下を定義。
public static ThreadLocal<String> remoteIpAddress = new ThreadLocal<String>();
内部クラスWorkerProcessのrun()メソッドの冒頭に以下を追加。
try { Field field = TSocket.class.getDeclaredField("socket_"); field.setAccessible(true); Socket socket = (Socket)field.get(client_); String ip = socket.getInetAddress().getHostAddress(); remoteIpAddress.set(ip); } catch (Exception ex) { ex.printStackTrace(); }
- ハンドラの中では以下のようにipアドレスを取得。
String remoteIp = MyThreadPoolServer.remoteIpAddress.get();
※もちろん、thriftのソースコードを修正してしまった方が簡単だが、ここではあえてそうしないようにした。