请教HttpWebRequest 和 HttpClient底层TCP的区别

中文命名法 2018-03-15 11:52:20
看到一个blog说HttpClient()的优势是在于TCP连接不释放,降低连接时间。先不讨论他们之间同步和异步的区别。
我想了解几个问题:
一,这是真的吗?
二,如果每秒访问一次相同的url,怎样能做到TCP连接不释放?是不是通过TcpClinet()实现?能否给我一个Demo;
三,如果顺序访问相通域名(https://163.com)下的不同url(/mail和/game),能否做到TCP连接不释放?
...全文
860 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-03-15
  • 打赏
  • 举报
回复
httpclient总是尽量重用连接。它不要求任何配置,默认情况下就是这样。 当然这个连接是指到网络的物理连接(Tcp/Ip) 只要你不注销 HttpClient 对象,就可以复用连接,并不需要顾及是一个目标网站还是多个目标网站(因为网络都是连通,只是数据报不同而已)
X-i-n 2018-03-15
  • 打赏
  • 举报
回复
先说个不相关的,你这么写不太合理,TcpClient在创建以后,连接服务器、发送、接收都应该是异步的,要为连接成功、收到消息写回调 。建议找一些规范的socket通讯示例代码学习一下。 回正题,发送和接收都绑定在特定的TcpClient对象,每个client之间的方法也好,事件也好都互不干扰,所以不会有不匹配的问题。
by_封爱 版主 2018-03-15
  • 打赏
  • 举报
回复
不释放?? 不都是短链接吗....
中文命名法 2018-03-15
  • 打赏
  • 举报
回复
引用 4 楼 Runnerchin 的回复:
个人理解并非如此。只有向同一个服务器请求时才有可能保持,一个完整的http请求结束后,维持tcp连接等待下次使用(另外,还需要考虑服务器的 tcp keepalive,如果服务器使用了反向代理或者负载均衡,还要考虑代理层的会话保持时间)。但是HTTP归根到底还基于TCP协议(IP+端口),请求不同服务器的时候,连端点都不一样了,连接复用无从谈起,必须新建一条。
引用 6 楼 wanghui0380 的回复:
有关原始的HttpClient问题,其实最早也出现在infoq上,下面是博客园童鞋们转摘的,原始httpclient的相关讨论https://news.cnblogs.com/n/553217/
TcpClient 客户端 = new TcpClient();
客户端.Connect("data.gateio.io", 80);
String 头 = "GET /api2/1/orderBook/smt_eth HTTP/1.1\r\nHost: data.gateio.io\r\nConnection: keep-alive\r\n\r\n";
Byte[] 字节 = Encoding.UTF8.GetBytes(头);
客户端.Client.Send(字节);
字节 = new Byte[10240];
Int32 长度 = 客户端.Client.Receive(字节);
String 输出 = Encoding.UTF8.GetString(字节, 0, 长度);
继续讨论,假设我实例化TcpClient(),并且Connect之后,程序里有多处同时发起Send和Receive,那发送和接受可能产生不匹配的问题吗?
wanghui0380 2018-03-15
  • 打赏
  • 举报
回复
有关原始的HttpClient问题,其实最早也出现在infoq上 下面是博客园童鞋们转摘的,原始httpclient的相关讨论 https://news.cnblogs.com/n/553217/
wanghui0380 2018-03-15
  • 打赏
  • 举报
回复
额,我能告诉你。博客园那些资料稍微过时了么? 最新信息是,微软对HttpClient已经做出了改进 http://www.infoq.com/cn/news/2018/03/HttpClientFactory/
X-i-n 2018-03-15
  • 打赏
  • 举报
回复
个人理解并非如此。只有向同一个服务器请求时才有可能保持,一个完整的http请求结束后,维持tcp连接等待下次使用(另外,还需要考虑服务器的 tcp keepalive,如果服务器使用了反向代理或者负载均衡,还要考虑代理层的会话保持时间)。但是HTTP归根到底还基于TCP协议(IP+端口),请求不同服务器的时候,连端点都不一样了,连接复用无从谈起,必须新建一条。
xuzuning 2018-03-15
  • 打赏
  • 举报
回复
是吧,你测试一下 据说 HttpWebRequest 是 TcpClient 的父类,我总觉得 TcpClient 要比 HttpWebRequest 慢
中文命名法 2018-03-15
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
httpclient总是尽量重用连接。它不要求任何配置,默认情况下就是这样。当然这个连接是指到网络的物理连接(Tcp/Ip)。只要你不注销 HttpClient 对象,就可以复用连接,并不需要顾及是一个目标网站还是多个目标网站(因为网络都是连通,只是数据报不同而已)
TcpClient 客户端 = new TcpClient();
客户端.Connect("data.gateio.io", 80);
String 头 = "GET /api2/1/orderBook/smt_eth HTTP/1.1\r\nHost: data.gateio.io\r\nConnection: keep-alive\r\n\r\n";
Byte[] 字节 = Encoding.UTF8.GetBytes(头);
客户端.Client.Send(字节);
字节 = new Byte[10240];
Int32 长度 = 客户端.Client.Receive(字节);
String 输出 = Encoding.UTF8.GetString(字节, 0, 长度);
消息框.Text = 输出;
是不是能这样理解,只要第一行的客户端实例不被销毁,复用第2-9行, 就是所谓的连接不释放?从而可以获得比HttpWebRequest 更快的速度?

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧