我正在开发一个工具,其中包括强制应用程序的所有网络流量通过 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 代理?