使用 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 格式错误的回复

使用 socks4 时的认证方式

如何使用 okHttpClient 执行 graphql 查询?

添加自签名证书 OkHttpClient

尝试创建 OkHttpClient 对象时出现 kotlin/TypeCastException

Android Studio OkHttpClient使用