LiveConnectでJavaScriptからJavaAppletの関数を呼び出す
LiveConnectという仕組みでJavaScriptとJavaAppletは相互に通信できるようなので、JavaScriptからJavaAppletの関数呼び出しを試してみました。
JavaApplet側の関数はクライアントIPアドレスの取得関数にしました。
public class ClientUtility extends javax.swing.JApplet { /** Creates a new instance of ClientUtility */ public ClientUtility() { } public static String getClientIPAddress() throws Exception { if (localAddress == null) { throw new NullPointerException(); } return localAddress.getHostAddress(); } public void initClientAddress(String testURL) throws Exception { URL url = new URL(testURL); Socket socket = new Socket(); int port = url.getPort() == -1 ? 80:url.getPort(); socket.connect(new InetSocketAddress(url.getHost(), port)); localAddress = socket.getLocalAddress(); socket.close(); } private static InetAddress localAddress = null; }
アドレス取得は、InetAddress#getLocalHostでいけるかと思ったのですがダメだったので、一度testURLのあるホストへ接続して、そのソケットのバインドされたアドレスから取得するようにしました。
このアプレットを
<applet name="JavaWrapper" codebase="classes" code="ClientUtility.class" width="0" height="0">
という感じでページに貼り付けて、JavaScriptから
document.JavaWrapper.initClientAddress(document.URL); var ipAddress = document.JavaWrapper.getClientIPAddress();
こんな感じで呼び出せます。
サンプルページ
実用性の話をすると微妙で正直使いそうにないですけど、Javaは起動が遅いなりに起動してからはそこそこ速いですし、ライブラリも豊富なので、JavaScriptで作るにはためらいを感じる処理やJavaScriptでは機能的に無理な処理、たとえばRSAでの認証処理やサーバソケットの制御などには使えるかもしれません。