96SEO 2026-02-23 14:40 10
我们在序列化和反序列化这一章中实现了一个网络版的计算器。

这个里面设计到了对协议的分析与处理。
比如我们应该以约定好的格式发送然后对方再以特定的方式解析数据。
这种双方约定好的格式叫做协议。
而实现加减乘除计算的那些逻辑代码正是我们所说的业务。
我们也发现了制定协议然后解析协议这些步骤的繁琐。
所以已经有大佬帮我们制定好现成的协议了可以供我们使用和参考。
那么http协议顾名思义也就是对数据的一种解析工作。
的缩写中文称为统一资源定位符它是互联网上标识和定位资源如网页、图片、视频等的字符串。
URL
用于指定一个资源在互联网上的位置使用户可以通过浏览器或其他网络工具来访问这个资源。
也就是说在全球范围内只要找到它的url就能访问该资源一个url的组成如下
192.168.0.1。
其中域名需要解析成先解析成ip地址。
域名解析过程需要通过域名系统DNS进行将域名转换为对应的
端口号Port可选项指定用于访问资源的端口号。
如果未指定默认使用资源所属协议的默认端口。
例如HTTP
Parameters可选项提供额外的参数传递给服务器。
查询参数以问号
Identifier可选项用于指定资源中的特定片段。
片段标识以井号
https://baike.baidu.com/pic/%E9%AD%94%E6%96%B9/5275/0/4610b912c8fcc3cec3fdbc20e30cc188d43f87948ac5?frlemmafromModulelemma_content-imagectsingle#aid0pic4610b912c8fcc3cec3fdbc20e30cc188d43f87948ac5
2.主机名baike.baidu.com没有指定端口则默认指定端口为443.
ip来标识唯一的一台机器port标识该机器上服务的进程后面/a/b/c/d代表用户想要的文件名。
中某些字符具有特殊的含义或用途例如用于分隔协议、主机名、路径等如果
编码规则如下将需要转码的字符转为两位16进制前面加上%编码成%XY格式
例如字符‘’的ASCII码值是43现将其转为16进制为2B然后我们再它的前面加上%成为%2B.例如我们在网站中输入c
时如果其中包含编码字符就需要对这些编码字符进行解码以恢复原始的字符表示。
URLDecode
通过将特殊编码表示转换为相应的原始字符来实现。
例如将“%2B”解码为‘’“%20”
单纯的站在请求和响应的报文角度http是基于行的文本协议.http请求报头格式
冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束Body:
则在Header中会有一个Content-Length属性来标识Body的长度;
我们从网站上获得、请求到的各种资源大多是GET方法。
例如我们想获取百度首页我们先telnet连接到百度然后GET
GET用于从服务器获取或检索资源通过URL查询字符串传递参数。
GET请求可以通过在URL中附加参数来传递数据这些参数以键值对的形式出现并使用?“来将URL路径与参数分隔不同参数之间使用”进行分隔。
例如(https://blog.csdn.net/weixin_47257473/article/details/132575491?spm1001.2014.3001.5501会将参数spm1001.2014.3001.5501
传递给/132575491)GET请求的参数会显示在URL中因此对于敏感数据不宜使用GET请求。
GET请求通常用于读取数据如获取网页内容、检索资源等。
GET请求是幂等的即多次执行相同的GET请求服务器的状态和资源都不应该发生变化。
常见的就是我们点击某个按钮没反应然后我们就点击多次但最后就只执行了一次。
比如登录的时候点击多次登录按钮但最后并不会登录多个qq号.
Body传递参数。
POST请求的参数通过请求头的Content-Type字段和请求体发送参数不会显示在URL中并且可以传输更大量的数据。
POST请求不会在浏览器的历史记录中留下记录对于敏感数据和数据的修改操作应该使用POST请求。
POST请求是非幂等的即多次执行相同的POST请求会对服务器的状态和资源进行修改。
GET和POST本质是没有区别的.使用GET的场景可以使用用POST,
GET是通过把客户端的数据通过请求行(query)来传输到服务端POST会将客户端数据放入到正文部分然后传输。
GET
习惯上用于客户端从服务器获取数据而由于是通过query传输数据所以是明文的POST
习惯上是客户端向服务器提交数据是通过正文部分传输所以不会显示在上方url中.GET的请求是幂等的而POST的请求可以不是幂等的.GET
客户端发送GET请求到服务器服务器把请求的资源同样返回给客户端.
同样有一点需要说明的是POST并不比GET安全因为它们的数据都是明文的没有加密的。
GET只不过是把结果显示到了url中POST的虽然在正文中没有显示出来但同样可以获取到正文的数据。
黑客们完全可以在转发的网络节点劫取http请求然后获得其中的数据造成我们私密信息的泄露。
HTTP状态码是服务器在处理客户端请求时返回的3位数字代码用于表示请求的处理结果的标准化表示方式。
状态码提供了关于请求是否成功、发生了什么错误以及如何处理请求的信息方便客户端和服务器之间进行通信和理解。
1xx信息性状态码表示请求已经被接收或正在处理需要进一步操作或等待常见的状态码有
Continue接收到请求的初始部分客户端应继续发送剩余部分。
101
表示由于客户端的错误或无效请求导致服务器无法处理请求常见的状态码有
Unavailable服务器当前无法处理请求通常是由于过载或维护。
我们先开启我们的服务端然后从浏览器中请求服务端我们看收到的客户端请求
我们可以看到有很多以冒号分割的(key-value)键值对;每组属性之间使用\n分隔;遇到空行结束。
数据类型(text/html等例如选择text浏览器则不会解释html语言而是直接以文本形式显示.)Content-Length:
3.无状态(即浏览器不知道你是否访问过此界面但实际我们使用的时候一般网站会记录我的状态的)
针对于第3点例如我们需要登录账号才能访问服务。
我这次登录后由于网站没有状态所以每次进该网站都要登录会非常的麻烦。
所以便有了cookie文件.cookie文件保存了此次用户输入的账号和密码等信息当用户再次访问该网站时cookie会自动携带用户的账户和密码发送给服务端便省去了每次都要登录的步骤。
但是如果有黑客在我们电脑的浏览器中注入了一个木马然后获取到了我们的cookie信息这样也就把我们的账号和密码就全部获取到了这是非常危险的。
所以为了避免这些我们在输入用户名和密码的基础上加上了认证这一步骤。
当我们从客户端输入账号和密码后服务器端会利用算法生成一个唯一id
id然后把你的账号和密码全部维护在服务器端然后把这个session
id返回给客户端此时cookie文件中不再保存账号和密码而是直接保存这个session
id所以后面再访问服务时不再传输账号和密码而是直接传输这个session
这样就极大程度的保护了用户的个人信息虽然说黑客还是有一定可能通过这个登录我们的账号但是我们的个人信息被保护了起来没有被泄露。
而且对应网站也可以采取一些措施比如如果位置变化很远服务端便立马让此cookie失效需要重新输入账号密码。
极大程度的保护了我们的隐私安全。
这个我们将制作一个简易版的http的demo。
我们的目的是当有客户端请求我们的网站时我们能对这个请求做出响应并展示请求的结果。
这里我们主要编写服务端客户端我们使用telnet或者直接网页输入地址进行连接访问即可。
这里共有5个文件包括Sock.hpp(对socket系列接口的封装)、HttpServer.hpp(服务器的相关接口主要是包括对服务器的初始化以及启动等相关操作)、HttpServer.cc(服务器的主逻辑调用相关接口初始化服务器并提供一个回调函数即对请求的处理方法HandlerHttpRequest)、Util.hpp(用于对客户端请求字段的切分服务端提取相关的字段进行处理)、log.hpp(日志文件只要用于记录相关接口是否被成功调用)。
这部分前面好几章都已经详细介绍了代码不变主要就是对一些接口的封装
strerror(errno));exit(2);}return
AF_INET;//使用的协议簇为IPv4local.sin_port
htons(port);//填入端口号//local.sin_addr.s_addr
inet_addr(ip.c_str());local.sin_addr.s_addr
strerror(errno));exit(3);}}void
3.因为TCP是面向连接的意味着当我们正式通信的时候需要先建立连接if
server;memset(server,0,sizeof(server));server.sin_family
htons(server_port);server.sin_addr.s_addrinet_addr(server_ip.c_str());//
该服务器类有四个成员变量分别是listensock_表示监听的套接字port_表示该服务器开放的端口号Sock类的sock_用于后续调用相关的socket的接口func_,表示调用的方法。
sock.Socket();sock.Bind(listensock_,port_);sock.Listen(listensock_);}void
Start(){for(;;){signal(SIGCHLD,SIG_IGN);string
sock.Accept(listensock_,clientIp,clientPort);cout
0){func_(sockfd);exit(1);}close(sockfd);}}~HttpServer(){if(listensock_
然后我们使用的方法是HandlerHttpRequest该函数如下实现
先将客户端的请求数据读取到自定义的缓冲然后对请求到的数据进行切分。
首先由于http协议格式是基于行的文本协议所以我们可以先按行切分成每段存放到vector中然后对第一行进行按空格解析第一行是
我们接下来要对解析出来的url进行分析。
我们要知道根默认访问的是根是wwwroot然后在里面再创建一个子中创建一个test.html。
这样假设我们要访问test.html时需要在端口号后面加上/a/index.html.
表示访问成功然后加上刚才文件的路径构成一个完整的响应然后send发送给客户端。
std::endl;std::vectorstd::string
vblock;Util::cutString(vline[0],
in(target);if(in.is_open()){std::string
2){Usage(argv[0]);exit(0);}std::unique_ptrHttpServer
HandlerHttpRequest));httpserver-Start();return
首先使用find函数查找指定的字符得到该字符的下标然后利用substr得到这一段字符串然后后面循环如此进行便把字符串按照指定的字符分隔开了。
aaaa\r\nbbbbb\r\nccc\r\n\r\nstatic
std::endl;out-push_back(sub);start
out-push_back(s.substr(start));}
还有最后一个日志log.hpp这个写不写无所谓了大家可以把上面有关logMessage的去掉即可或改成if判断也可。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback