使用 OkHttpClient 时来自 SOCKS 服务器的格式错误的回复
Posted
技术标签:
【中文标题】使用 OkHttpClient 时来自 SOCKS 服务器的格式错误的回复【英文标题】:Malformed reply from SOCKS server when using OkHttpClient 【发布时间】:2020-09-05 09:15:59 【问题描述】:我正在使用 feign 客户端在 Java 中发送 REST 请求,它工作得非常好,但是当另外使用 OkHttpClient 时,我收到一条错误消息
Caused by: feign.RetryableException: Malformed reply from SOCKS server executing GET
我确定了导致此错误的代码行
OkHttpClient.Builder builder = new OkHttpClient.Builder();
...
builder.proxy(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(socksProxyHost, socksProxyPort)));
但是,由于我既需要 OkHttpClient 又需要使用 feign 客户端发送请求,我不能只删除它,而是必须找到解决方法。只要我通过 feign 发送请求并在之后将它们设置回来,有没有办法重置代理设置?我尝试将默认代理服务器设置为 null 使用
proxySelector.setDefault(null)
但不幸的是,这并没有解决我的问题。
感谢您的帮助!
【问题讨论】:
【参考方案1】:创建两个 OkHttpClient 实例,一个配置了代理,一个没有配置。
builder.proxy(Proxy.NO_PROXY);
如果您使用 OkHttpClient.newBuilder()
从另一个客户端创建一个客户端,他们将共享一个 ExecutorService
和其他资源。
【讨论】:
【参考方案2】:我通过分配一个新的 ProxySelector 而不是实际的代理解决了这个问题。在覆盖 select 方法时,我确保代理列表对于使用 feign 客户端发送的请求为空:
ProxySelector proxySelector = new ProxySelector()
@Override
public List<Proxy> select(URI uri)
if (uri.toString().contains("HOST_NAME"))
return List.of();
return List.of(
new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(socksProxyHost, socksProxyPort)));
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe)
;
builder.proxySelector(proxySelector);
【讨论】:
以上是关于使用 OkHttpClient 时来自 SOCKS 服务器的格式错误的回复的主要内容,如果未能解决你的问题,请参考以下文章
来自 SOCKS 服务器的 Android Orbot 格式错误的回复
如何使用 okHttpClient 执行 graphql 查询?