3

アプリケーションのすべてのネットワーク トラフィックが Java のソックス プロキシを経由するように強制するツールを開発しています。古いソケット API の場合、システム プロパティを「-DsocksProxyHost=my-host -DsocksProxyPort=my-port」に設定するだけで済みますが、NIO では機能しません。

私は解決策を試しました:

SocketChannel を拡張する「ProxySocketChannel」と呼ばれる NIO SocketChannel を作成しました。ソックス接続とその他のソックス プロキシ ロジックが含まれています。しかし、実行すると、「SelectorImpl.register」の次のコード行で「IllegalSelectorException」が発生しました。

if (!(ch instanceof SelChImpl))
        throw new IllegalSelectorException();

sun.nio.ch.SelChImpl はパッケージが表示されているため、アクセスできません。私はトリッキーな解決策を試しました。「ProxySocketChannel」をパッケージ「sun.nio.ch」に入れました。コンパイルは成功しましたが、実行時にエラーが発生しました:

java.lang.IllegalAccessError: class sun.nio.ch.ProxySocketChannel cannot access its superinterface sun.nio.ch.SelChImpl

パッケージ sun.nio.ch.ProxySocketChannel のクラス sun.nio.ch.ProxySocketChannel がまだ sun.nio.ch.SelChImpl にアクセスできない理由がわかりません。JDK組み込みクラスにはある程度の保護があると思います。アクセスする方法はありますか?

私のJDKバージョンは1.6.0_65です。

それ以外の場合、既存のコードを変更せずに NIO のソックス プロキシをセットアップする方法はありますか?

4

2 に答える 2

1

これは非常に困難です。私はSSLSocketChannel数年前にクラスを書きましたが、結局、独自のSSLSelectorProviderSSLSelector、およびSSLSelectionKeyクラスも作成する必要がありました。派生クラスを既存のインフラストラクチャに単純に追加することはできませんSocketChannel。それを防ぐために特別に設計されています。

于 2013-10-21T08:58:07.320 に答える
0

EJP そうです、これは大変なことです。汚いトリックを使用して OP をオリジナルに登録しSocketChannel、OP がトリガーされたらオンザフライで独自の実装にチャネルをスワップできます。しかし、正しいアプローチは独自の をSelectorProvider作成することでSelectorあり、可能であれば SSL にstunnelSelectionKeyを使用することを真剣に検討するようになります。

于 2015-09-10T03:42:07.283 に答える