问题描述
我正在开发一个工具,其中包括强制应用程序的所有网络流量穿过Java中的socks代理。对于旧的Socket API,我可以设置系统属性-DsocksProxyHost = my-host -DsocksProxyPort = my-port,但它不适用于NIO。
I'm developing a tool which includes forcing all network traffic of application to go across a socks proxy in Java. For old Socket API, I can just set system properties "-DsocksProxyHost=my-host -DsocksProxyPort=my-port", but it doesn't work with NIO.
我尝试了一个解决方案:
I tried a solution:
我写了一个名为ProxySocketChannel的NIO SocketChannel,它扩展了SocketChannel。它包含socks连接和其他socks代理逻辑。但是当我运行它时,我在SelectorImpl.register中的这行代码中得到了一个IllegalSelectorException:
I wrote an NIO SocketChannel, called "ProxySocketChannel" which extends SocketChannel. It contains socks connection and other socks proxy logic. But when I run it, I got an "IllegalSelectorException" in this line of code in "SelectorImpl.register":
if (!(ch instanceof SelChImpl))
throw new IllegalSelectorException();
sun.nio.ch.SelChImpl包是可见的,所以我无法访问它。我尝试了一个棘手的解决方案:我将ProxySocketChannel放在包sun.nio.ch中。编译通过,但运行时遇到错误:
sun.nio.ch.SelChImpl is package visible so I can't access it. I tried a tricky solution: I put my "ProxySocketChannel" in package "sun.nio.ch". The compilation passed, but I got an error when running:
java.lang.IllegalAccessError: class sun.nio.ch.ProxySocketChannel cannot access its superinterface sun.nio.ch.SelChImpl
我不知道为什么太阳级。包sun.nio.ch的nio.ch.ProxySocketChannel仍然无法访问sun.nio.ch.SelChImpl。我认为JDK内置类有一些保护。有没有办法访问它?
I don't know why the class sun.nio.ch.ProxySocketChannel with package sun.nio.ch still can not access sun.nio.ch.SelChImpl. I think there is some protection for JDK built-in classes. Is there a way to access it?
我的JDK版本是1.6.0_65。
My JDK Version is 1.6.0_65.
否则,是否有在不更改现有代码的情况下为NIO设置socks代理的方法?
Otherwise, is there a way to setup socks proxy for NIO without change existing code?
推荐答案
这非常困难。几年前我写了一个 SSLSocketChannel
类,最后我不得不写自己的 SSLSelectorProvider
, SSLSelector
,以及 SSLSelectionKey
类。您不能只在现有基础架构中添加 SocketChannel
- 派生类:它专门用于防止它。
This is seriously difficult. I wrote an SSLSocketChannel
class some years ago and I ended up having to write my own SSLSelectorProvider
, SSLSelector
, and SSLSelectionKey
classes as well. You can't just add a SocketChannel
-derived class into the existing infrastructure: it is specifically designed to prevent it.
这篇关于如何在Java NIO中配置socks代理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!