= リモートIPアドレスの取得 = サーバ側に接続してきたクライアントのIPアドレスを取得する方法。 サーバ側の構成によって、異なる方法があるとおもわれる。 thrift-0.8.0の場合。 == TThreadPoolServerを改造する方法 == ここではTThreadPoolServerを使用するものとし、それを改造する。 * TThreadPoolServerのソースをまるまるコピーし、名前をMyThreadPoolServerとでもする。 * (どこでも良いのだが)MyThreadPoolServerのstaticフィールドとして以下を定義。 {{{ public static ThreadLocal remoteIpAddress = new ThreadLocal(); }}} * 内部クラス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のソースコードを修正してしまった方が簡単だが、ここではあえてそうしないようにした。