Java RMI トラフィックをスニッフィングして分析するにはどうすればよいですか? Wireshark には非常に部分的なソリューションしかありません。TCP 接続をスニッフィングして、どのメソッドが呼び出され、どの引数が渡されたかを正確に知る必要があります。
4 に答える
いくつかのJavaプロパティを設定して、rmiをより冗長にすることができます。
おそらく次の設定が必要です。
sun.rmi.client.logCalls(1.4以降)
このプロパティの値がtrueの場合、sun.rmi.client.callロガーはレベルLevel.FINERに設定されます。リモート呼び出しはレベルLevel.FINERでログに記録され、リモート呼び出しからの例外はレベルLevel.FINEでログに記録されます。
それを「スニッフィング」する必要がありますか、それともクライアントまたはサーバーにカスタム ソケット ファクトリをデプロイできますか?
過去に、RMI サービスによって読み取られるストリームに「ティー」を作成するカスタム RMI サーバー ソケット ファクトリを作成しました。RMI ランタイムがストリームの 1 つを正常に読み取るため、私のコードは解析する JRMP のコピーも取得しました。私の場合、シリアル化された形式のパラメーターを含むリモート呼び出しをログに記録していたので、後で負荷テストのためにそれらを「再生」できました。RMI ログ オプションを有効にするだけでは十分ではありませんでした。
問題の 1 つは、JRMP のドキュメントが貧弱で、場合によっては不正確であることです。もう 1 つの理由は、必要なコードの多くがコア Java API の一部ではないことです。複雑でした。始める前は RMI をよく理解していると思っていましたが、この小さなプロジェクトを実行した後、さらに多くのことを学ばなければならないことに驚きました。
Wireshark によってキャプチャされたアプリケーション データにも同様のアプローチを適用できますが、Wireshark 用のアナライザーを作成したことがないため、それがどれほど複雑かはわかりません。
Etherealは役立つかもしれませんが、それはかなり低レベルです。
RMIトラフィックをネットワークから盗聴して解読できるツールを知りません。他の誰もそうしない場合、最適ではない解決策は、スタブ/スケルトン(Java 5以降を使用している場合はおそらく自動生成されます)またはRMIインフラストラクチャの一部をログメッセージを出力するコードでインストルメント化することです。
これを実現するには、AOPまたはバイトコード操作ツールを使用できます。私はあなたと同様のタスクにJavaAssistを使用して成功しました。この種のツールとしては非常に使いやすいです。