3

我正在开发一个工具,其中包括强制应用程序的所有网络流量通过 Java 中的 socks 代理。对于旧的 Socket API,我可以设置系统属性“-DsocksProxyHost=my-host -DsocksProxyPort=my-port”,但它不适用于 NIO。

我尝试了一个解决方案:

我写了一个 NIO SocketChannel,叫做“ProxySocketChannel”,它扩展了 SocketChannel。它包含 socks 连接和其他 socks 代理逻辑。但是当我运行它时,我在“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包的sun.nio.ch.ProxySocketChannel类仍然无法访问sun.nio.ch.SelChImpl。我认为JDK内置类有一些保护。有没有办法访问它?

我的 JDK 版本是 1.6.0_65。

否则,有没有办法在不更改现有代码的情况下为 NIO 设置 socks 代理?

4

2 回答 2

1

这是非常困难的。几年前我写了一个SSLSocketChannel类,最后我也不得不写自己的SSLSelectorProvider,SSLSelectorSSLSelectionKey类。您不能只将SocketChannel- 派生类添加到现有基础架构中:它是专门为防止它而设计的。

于 2013-10-21T08:58:07.320 回答
0

EJP 是对的,这很难。您可以使用肮脏的技巧将 OP 注册到原始版本SocketChannel,然后在触发 OP 后即时将通道交换到您自己的实现。但正确的方法是编写自己的.如果可以的话SelectorProvider,这会让您认真考虑使用stunnel进行 SSL。SelectorSelectionKey

于 2015-09-10T03:42:07.283 回答