当前位置: 首页 > 知识库问答 >
问题:

为什么HttpClient保持套接字打开?

顾池暝
2023-03-14
using System.Net.Http;

namespace HttpClientTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            for (var i = 0; i < 10; i++)
            {
                using (var httpClient = new HttpClient())
                {
                   var result = httpClient.
                        GetAsync("http://stackoverflow.com/").
                        Result;
                }
            }
        }
    }
}

我注意到netstat的套接字是打开的:

TCP    10.200.60.168:2722     151.101.193.69:http    TIME_WAIT
TCP    10.200.60.168:2751     151.101.193.69:http    TIME_WAIT
TCP    10.200.60.168:2752     151.101.193.69:http    TIME_WAIT
TCP    10.200.60.168:2753     151.101.193.69:http    TIME_WAIT
TCP    10.200.60.168:2754     151.101.193.69:http    TIME_WAIT
TCP    10.200.60.168:2755     151.101.193.69:http    TIME_WAIT
TCP    10.200.60.168:2756     151.101.193.69:http    TIME_WAIT
TCP    10.200.60.168:2757     151.101.193.69:http    TIME_WAIT
TCP    10.200.60.168:2758     151.101.193.69:http    TIME_WAIT
TCP    10.200.60.168:2759     151.101.193.69:http    TIME_WAIT

这是意料之中的行为吗?我是否需要显式地将连接头值设置为close以防止这种情况发生?

httpClient.
    DefaultRequestHeaders.
    Connection.
    Add("close");

共有1个答案

高皓
2023-03-14

HttpClient的每个实例都将其连接池化以获得更好的性能,但这意味着每个实例还将池化的连接保留在不使用时的TIME_WAIT中。

HttpClient实际上是线程安全的、可重入的,并且是为扩展使用而设计的;在程序退出之前,不应处理它(即使它实现了IDisposable)。您应该在整个应用程序中共享HttpClient的一个实例,以利用这一点。

更多信息可以在这里找到。

 类似资料:
  • 我编写了简单的服务器/客户端程序,其中客户端将一些硬编码数据以小块形式发送给服务器程序,服务器程序正在等待数据,以便将其打印到终端。在客户端,我在循环中调用send(),同时有更多的数据要发送,而在服务器上,我使用read()执行同样的操作,即返回的字节数为 如果我在完成发送后专门在客户端的套接字上调用close(),那么这个示例非常有效,但如果我不这样做,服务器将不会实际退出read()循环,直

  • 问题内容: 我是网络编程的新手。我有兴趣通过Java服务器和C客户端之间的套接字建立网络连接并保持连接无限打开的可能吗?我想保持连接打开状态以在客户端之间交换XML数据。 问题答案: 从理论上讲,可以无限期地打开服务器套接字;但是,使用客户端套接字是不可能的。主要原因是因为客户端套接字取决于处理数据的服务器端套接字,并且服务器套接字可能会关闭连接。 尽管可以无限期地保持连接打开,但实际情况通常会确

  • 我一直在思考为什么JDBC只是阻塞操作,为什么我不能为假设的事件处理程序onResultSetArrived(ResultSet rs)设置一些侦听器。为什么我必须为每个JDBC查询阻塞一个线程。 过了一段时间,我深入研究了Java套接字(我想JDBC是构建在它们之上的),并意识到也没有任何事件处理。提供非阻塞读取的唯一选项是通过available()方法,但这非常低效,因为必须在循环中定期检查它

  • 问题内容: 我有一组具有保持活动状态的TCP套接字(间隔1分钟),由 循环(选择读取)控制。 如果集合中的一个套接字发生了保持活动超时,是否会返回错误? 哪个错误会返回? 问题答案: 如果为其选择的其中一个套接字发出了错误信号,则它本身不会返回错误。[实际上,API无法以这种方式指示每个套接字的错误,因为两个不同的套接字可能在的一次调用中就各自获取挂起的错误。哪一个会回来?] 在循环的每次迭代之后

  • 问题内容: 我正在使用POST方法。我需要创建一次,并且应该使用Keep Alive Connection。但是我认为,它每次都会建立一个新的连接。 因此,我需要使用 保持活动 连接。 这是我的代码段,很多帮助将不胜感激。 而且logcat日志是: 问题答案: 10:07:29.746:D / org.apache.http.headers(1529):>>连接:保持活动 您正在要求保持活动状态。

  • 我有两个服务器“A”(由我的朋友构建)和“B”(由我构建,使用Netty 4.1)。当客户端发送命令时,此服务器“A”和“B”会返回一些响应。我尝试使用简单的JAVA客户端套接字访问该服务器。以下是java客户端代码: 当将客户机连接到服务器A(非netty)时,方法会给出如下输出: 但是,当我尝试连接到服务器“B”(使用netty)时,输出如下: 为什么会发生这种情况?顺便说一下,在服务器B中,