为什么OkHttp不重用它的连接?

我使用OkHttp 3.5.0执行http-benchmark。 我发送了数千个请求到相同的URL。

我期望OkHttp客户端使用ConnectionPool并重复使用它的连接。 但是如果我们看一下netstat我们会看到TIME_WAIT状态下有很多连接:

 TCP 127.0.0.1:80 127.0.0.1:51752 TIME_WAIT TCP 127.0.0.1:80 127.0.0.1:51753 TIME_WAIT TCP 127.0.0.1:80 127.0.0.1:51754 TIME_WAIT TCP 127.0.0.1:80 127.0.0.1:51755 TIME_WAIT TCP 127.0.0.1:80 127.0.0.1:51756 TIME_WAIT ... 

成千上万的请求后,我得到一个SocketException: No buffer space available (maximum connections reached?)

代码执行请求(Kotlin):

 val client = OkHttpClient.Builder() .connectionPool(ConnectionPool(5, 1, TimeUnit.MINUTES)) .build() val request = Request.Builder().url("http://192.168.0.50").build() while (true) { val response = client.newCall(request).execute() response.close() } 

如果不使用response.close()而是使用response.body().string() ,那么SocketException不会发生,但是netstat仍然显示出大量的TIME_WAIT连接,并且基准性能越来越低。

我究竟做错了什么?

PS:我试图使用Apache HttpClient和它的PoolingHttpClientConnectionManager ,看起来像它的作品完美。 但是我想知道OkHttp有什么问题。

Interesting Posts