android - 使用 OkHttp 覆盖 SocketFactory 后的问题

在将应用更新到API21并使用OkHttp2.2.0后,开发者遇到一个异常:java.net.SocketException:Unconnectedsocketsnotimplemented。问题源于OkHttp的Connection类在2.1.0版本后改变的工作方式,需要在自定义SocketFactory的createSocket()方法中进行适配。解决方案是覆盖createSocket()并使用默认SocketFactory创建包装的Socket。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将我的应用程序更新到 api 21 后,我遇到了 https 请求的问题。经过深入的代码审查后,我发现了一个有趣的错误。我的app现在已经用api-21编译了,这个api在sdk里面有一个新版本的okHttp,版本2.2.0。旧版app使用okHttp 2.0.0版本。对于 2.2.0 版本,当我尝试打开新的 https 请求时出现异常。异常(exception)是:java.net.SocketException: Unconnected sockets not implemented

将我的应用程序更新到 api 21 后,我遇到了 https 请求的问题。经过深入的代码审查后,我发现了一个有趣的错误。

我的app现在已经用api-21编译了,这个api在sdk里面有一个新版本的okHttp,版本2.2.0。旧版app使用okHttp 2.0.0版本。

对于 2.2.0 版本,当我尝试打开新的 https 请求时出现异常。异常(exception)是:

java.net.SocketException: Unconnected sockets not implemented at javax.net.SocketFactory.createSocket(SocketFactory.java:64) at com.squareup.okhttp.Connection.connect(Connection.java:144) at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java:169) at com.squareup.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:119) at com.squareup.okhttp.internal.http.RouteSelector.next(RouteSelector.java:134) at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:314) at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:237) at com.squareup.okhttp.Call.getResponse(Call.java:233) at com.squareup.okhttp.Call.execute(Call.java:84)
问题是 okHttp 改变了 Connection 类在 2.1.0 版本上的工作方式。在版本 2.0.0 上,连接直接创建一个新的普通 Socket,但知道这个套接字对套接字工厂的请求,这个套接字将被升级到 TLS。变化是:

socket = route.address.socketFactory.createSocket();
我的问题是我已经为 NotHttpSocketFactory 覆盖了 socketFactory,而这个实现什么也没做(没关系,你想删除 http 连接)并且方法 createSocket() 没有被覆盖。我不喜欢允许 http 请求。

我重写了 SocketFactory。

client.setSocketFactory(new BlackphoneStubSocketFactory());
我不明白为什么我需要一个普通的套接字,因为我正在创建一个 https 请求。这是必要的吗?我可以重写方法 createSocket() 并返回一个空套接字,但这是必要的,或者它是 OkHttp 上的一个错误。

最佳答案

确保在自定义工厂上定义 createSocket()。

val httpClient = OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) .retryOnConnectionFailure(false) .socketFactory(object: SocketFactory() { val factory = SocketFactory.getDefault() override fun createSocket(): Socket { return wrap(factory.createSocket()) } override fun createSocket(p0: String?, p1: Int): Socket { return wrap(factory.createSocket(p0, p1)) } override fun createSocket(p0: InetAddress?, p1: Int): Socket { return wrap(factory.createSocket(p0, p1)) } override fun createSocket(p0: String?, p1: Int, p2: InetAddress?, p3: Int): Socket { return wrap(factory.createSocket(p0, p1, p2, p3)) } override fun createSocket(p0: InetAddress?, p1: Int, p2: InetAddress?, p3: Int): Socket { return wrap(factory.createSocket(p0, p1, p2, p3)) } private fun wrap(s: Socket): Socket { s.receiveBufferSize = 32*1024*1024 return s } }) .build()

关于android - 使用 OkHttp 覆盖 SocketFactory 后的问题,我们在Stack Overflow上找到一个类似的问题: android - Problems after override SocketFactory with OkHttp - Stack Overflow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值