java - 如何在 Java NIO 中配置 socks 代理

标签 java classloader nio

我正在开发一种工具,其中包括强制应用程序的所有网络流量通过 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.ProxySocketChannel包中的类sun.nio.ch仍然无法访问sun.nio.ch.SelChImpl。我认为对 JDK 内置类有一些保护。有没有办法访问它?

我的 JDK 版本是 1.6.0_65。

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

最佳答案

这是非常困难的。几年前我编写了一个 SSLSocketChannel 类,最后我不得不编写自己的 SSLSelectorProviderSSLSelectorSSLSelectionKey 类(class)也是如此。您不能只是将 SocketChannel 的派生类添加到现有基础设施中:它是专门为防止这种情况而设计的。

关于java - 如何在 Java NIO 中配置 socks 代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19487363/

相关文章:

java - 线程同步 - 打印到文件

java - 是否可以在 Java 和/或 Android 中使用 NIO Selector for FileChannels?

java - 定义自定义系统类加载器

java - 从测试方法访问时单例返回新实例

Java 获取方法 "class not found"

java - 查看有多少直接缓冲内存可用于 Java?

java - socketChannel.register() 和 key.interestOps() 的区别?

java - 从 List/ArrayList 获取最后三个元素?

java - 在Android中的Canvas上绘制圆外的位图(箭头)

java - Java Attach API 使用什么进程间通信机制?