我正在开发一个工具,其中包括强制应用程序的所有网络流量通过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代理?
这是非常困难的。我写了一个SSLSocketChannel
几年前的课程,我最终不得不自己写SSLSelectorProvider
, SSLSelector
, and SSLSelectionKey
课程也是如此。你不能只添加一个SocketChannel
- 派生类进入现有基础设施:它是专门为防止这种情况而设计的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)