架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 28|回复: 0

[资料] .NET/C# 使用 Socket 基于超文本传输协议发送 http(s) 请求

[复制链接]
发表于 5 小时前 | 显示全部楼层 |阅读模式
需求:每天打开网页或者 APP 应用,浏览的信息,几乎都是通过发送 http、https 请求响应来查看内容,使用 c# 基于超文本传输协议使用原生 Socket 发送 http 请求。

协议

超文本传输​​协议 (HTTP) 是一种无状态的应用层协议用于分布式、协作式超文本信息系统。

HTTP / 1.1 协议(RFC 9112):超链接登录可见。
HTTP 语义(RFC 9110):超链接登录可见。

请求示例:
GET /hello.txt HTTP/1.1
User-Agent: curl/7.64.1
Host: 超链接登录可见。
Accept-Language: en, mi

响应示例:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain

Hello World! My content includes a trailing CRLF.

Socket 发送请求

源码如下:
源码支持发送 http、https 协议的请求。如下图:

QQ截图20261010175245.jpg

Connection:close vs keep-alive

如果使用 ReadToEndAsync 读取响应的所有数据,需要将 Connection 设置成 close,如果设置成 keep-alive 会导致读取响应 ReadToEndAsync 卡死。没有卡死的原因:很多 Web 服务器(如 Nginx、Apache 或某些 API 网关)如果发现客户端是原生的自写 Socket,且没有后续动作,或者触发了服务器的空闲超时(通常配置为 5 秒),服务器就会主动发起 FIN 包关闭 TCP 连接。

http 流水线,同时发送多个请求:超链接登录可见。

Transfer-Encoding: chunked 表示数据是以分块的形式传输的。每个数据块前面都有一个指示该块大小的十六进制数字,这个数字后面跟着一个换行符(CRLF),然后是实际的数据内容,再接着另一个换行符来结束这一块。这种编码方式允许服务器在不知道全部内容长度的情况下开始发送数据。

fdd8 就是这样一个十六进制数,它指定了接下来的数据块的大小(以字节为单位)。将 fdd8 从十六进制转换成十进制,我们得到的是 65016 字节。这意味着紧接着 fdd8 和 CRLF 后面有 65016 字节的数据。之后,可能会有更多的数据块,直到遇到一个大小为 0 的块表示传输结束。

fdd8 告诉接收端接下来的数据块长度为 65016 字节。




上一篇:HTTP(s) 测试站点汇总(持续更新)
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2026-10-10 23:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表