Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaNIO中配置socks代理_Java_Classloader_Nio - Fatal编程技术网

如何在JavaNIO中配置socks代理

如何在JavaNIO中配置socks代理,java,classloader,nio,Java,Classloader,Nio,我正在开发一个工具,其中包括在Java中强制应用程序的所有网络流量通过socks代理。对于旧的套接字API,我可以只设置系统属性“-dsocksproxy主机=我的主机-dsocksproxy端口=我的端口”,但它不适用于NIO 我尝试了一个解决方案: 我编写了一个NIO SocketChannel,称为“ProxySocketChannel”,它扩展了SocketChannel。它包含socks连接和其他socks代理逻辑。但当我运行它时,我在“SelectorImpl.register”中的

我正在开发一个工具,其中包括在Java中强制应用程序的所有网络流量通过socks代理。对于旧的套接字API,我可以只设置系统属性“-dsocksproxy主机=我的主机-dsocksproxy端口=我的端口”,但它不适用于NIO

我尝试了一个解决方案:

我编写了一个NIO SocketChannel,称为“ProxySocketChannel”,它扩展了SocketChannel。它包含socks连接和其他socks代理逻辑。但当我运行它时,我在“SelectorImpl.register”中的这行代码中得到了一个“非法SelectorException”:

sun.nio.ch.selchinpl包可见,因此我无法访问它。我尝试了一个棘手的解决方案:我把我的“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.selchinpl。我认为JDK内置类有一些保护。有没有办法访问它

我的JDK版本是1.6.0_65


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

这是非常困难的。几年前我写了一个
SSLSocketChannel
类,最后我不得不编写自己的
SSLSelectorProvider
SSLSelector
,以及
SSLSelectionKey
类。您不能只在现有基础设施中添加一个派生自SocketChannel的类:它是专门为防止它而设计的。

EJP是正确的,这是很难做到的。您可以使用肮脏的技巧将OPs注册到原始的
SocketChannel
,然后在触发OPs后动态地将通道交换到您自己的实现中。但正确的方法是编写自己的
选择器或提供程序
,<代码>选择器< /代码>和<代码> SelectionKey < /代码>,这将使您认真考虑使用StimeL为SSL(如果您可以)。

<代码> IllegalAccessError < /代码>与同一包中的所有类必须由相同的<代码> ClassLoader < /代码>加载的事实有关。不幸的是,库类是通过引导程序CL加载的,而应用程序类是通过系统CL加载的。因此,您无法访问父类,因为它位于不同的包中。谢谢!我试图在BootstrapClassLoader中加载我的类,方法是编写一个Java代理,放置一行代码:
inst.appendToBootstrapClassLoaderSearch(newjarfile(mockFile))
java.lang.IllegalAccessError: class sun.nio.ch.ProxySocketChannel cannot access its superinterface sun.nio.ch.SelChImpl