当前位置: 首页 > news >正文

公司的网站建设服务费wordpress首页导航栏

公司的网站建设服务费,wordpress首页导航栏,北控水务建设发展有限公司网站,网站蜘蛛来访纪录如果你不能飞#xff0c;那就跑#xff1b; 如果跑不动#xff0c;那就走#xff1b; 实在走不了#xff0c;那就爬。 无论做什么#xff0c;你都要勇往直前。 --- 马丁路德金 --- 从零开始学习http协议 1 什么是http协议2 认识URL3 http的请求和应答3.1 服务端设计… 如果你不能飞那就跑 如果跑不动那就走 实在走不了那就爬。 无论做什么你都要勇往直前。 --- 马丁·路德·金 --- 从零开始学习http协议 1 什么是http协议2 认识URL3 http的请求和应答3.1 服务端设计3.2 如何让外界可以访问Linux云服务器3.3 运行测试 4 理解http请求与应答4.1 宏观理解4.2 http请求反序列化 1 什么是http协议 虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用。 HTTP(超文本传输协议)就是其中之一。http应用十分的广泛几乎每一名程序员无论前后端 无论C/Java/Go…都会接触到 在互联网世界中 HTTPHyperText Transfer Protocol 超文本传输协议 是一个至关重要的协议。 它定义了客户端如浏览器 与服务器之间如何通信 以交换或传输超文本超文本支持视频网页 图片等等 HTTP 协议是客户端与服务器之间通信的基础。 客户端通过 HTTP 协议向服务器发送请求 服务器收到请求后处理并返回响应。 HTTP 协议是一个无连接、 无状态的协议 即每次请求都需要建立新的连接 且服务器不会保存客户端的状态信息。 但是有个疑问http是基于TCP协议的也就是面向连接的为什么http确是无连接的协议呢 因为http会使用Tcp建立的链接无需再次建立新的链接。就好比之前我们实现的网络计算器服务端和客户端的连接是通过TCP建立的但是通信传输Request和Response直接通过Tcp建立的连接即可无需再次建立连接 2 认识URL 平时我们浏览的网站百度 哔哩哔哩 力扣…等等网站都有一个域名 百度 https://www.baidu.com/ 哔哩哔哩https://www.bilibili.com/ 力扣https://leetcode.cn/ ...这些网址都是https协议这些网址其实就是URL 访问时会将网址解析成IP地址一般成熟的协议名称与端口号是强关联的称之为知名端口号 HTTP (Hypertext Transfer Protocol)端口号80 用于在Web服务器和客户端之间传输网页。HTTPS (HTTP Secure)端口号443 HTTP的安全版本通过SSL/TLS加密传输数据。FTP (File Transfer Protocol) 控制端口21 用于文件传输。数据端口20主动模式或随机端口被动模式 SSH (Secure Shell)端口号22 用于安全地访问远程服务器。 为什么平时访问网站并没有输入端口号 只有同时具备IP地址和端口号才可以访问到对应的服务器浏览器发起请求时会自动拼接端口号80就类似日常生活中报警会自觉想到拨打110 火灾会自然的想到拨打119 通信中离不开“资源”两个字通信要么是从别处获取资源要么是向对方发送资源。http协议下的资源是超文本 网页图片音频视频都是超文本在进行通信之前用户想要获取的资源都在后端的云服务器中云服务器一般都是Linux系统那么在Linux视角下不就都是文件吗 为了将这个文件资源发给客户端就必须要找到这个文件那么怎么找到这个文件呢当然是通过文件的唯一标识符 — 路径来实现在URL中后半部分不就是我们的路径吗这样通过IP地址确定的唯一主机唯一的路径就可以标识互联网中的唯一的文件资源 注意第一个斜杠不是Linux服务器的根目录而是web根目录web根目录可以是Linux中的任何目录 所以URL就叫统一资源定位符 urlencode 和 urldecode 像 / ? : 等这样的字符已经被 url 当做特殊意义理解了。因此这些字符不能随意出现。比如,某个参数中需要带有这些特殊字符就必须先对特殊字符进行转义。转义的规则如下 将需要转码的字符转为 16 进制 然后从右到左 取 4位(不足 4 位直接处理) 每 2 位做一位 前面加上%编码成%XY 格式 3 http的请求和应答 3.1 服务端设计 下图是http请求的一个信息 接下来我们来通过代码实验来测试一下是否可以获取到这些信息 首先我们简化一下代码在传输层直接进行IO直接在Socket文件中获取数据流将线程的函数方法修改为以下形式 // 注意设置为静态函数 不然参数默认会有TcpServer* this!!!static void *Execute(void *args){pthread_detach(pthread_self()); // 线程分离// 执行Service函数TcpServer::ThreadData *td static_castTcpServer::ThreadData *(args);// 直接进行IOstd::string reqstr;// 这里默认读取到的是完整的请求ssize_t n td-_sockfd-Recv(reqstr);if (n 0){std::string resstr td-_this-_service(reqstr);td-_sockfd-Send(resstr);}td-_sockfd-Close();delete td;return nullptr;}回调函数单独设计一个HttpServer类来获取客户端申请的数据目前直接进行简单的打印处理就好 #include iostream #include stringclass HttpServer { public:HttpServer(){}std::string HandlerHelperRequest(std::string Requeststr){std::cout------------------std::endl;std::cout Requeststr std::endl;return std::string();//暂时这样}~HttpServer(){} };然后ServerMain中,将HandlerHelperRequest作为回调函数构造TcpServer进行启动即可那么接下来我们是不是就可以在外界通过IP地址和端口号就可以访问Linux服务器上启动的进程了呢还不可以我们需要对Linux云服务器做一些处理才能让外界成功的访问 3.2 如何让外界可以访问Linux云服务器 让外界可以访问Linux云服务器需要两步操作云服务器的安全组设置和服务器操作系统层面的防火墙设置。 云服务器的安全组设置操作步骤如下这里以阿里云服务器为例 首先在控制台中找到安全组打开需要操作的实例对象在实例中手动添加需要使用什么协议开放哪些端口手动保存即可 协议类型选择 TCP端口范围填写“8888/8888”或“8888-8888”授权对象可以设置为“0.0.0.0/0”以允许所有IP访问但出于安全考虑建议限制为您的IP地址或特定IP范围。 云服务器设置好时候接下来就进行服务器操作系统层面的防火墙设置 对于CentOS# 查看防火墙状态 sudo systemctl status firewalld # 如果需要启动防火墙服务 sudo systemctl start firewalld # 检查端口8888是否开放 sudo firewall-cmd --zonepublic --query-port8888/tcp # 如果端口未开放添加端口规则 sudo firewall-cmd --zonepublic --add-port8888/tcp --permanent # 重新加载防火墙规则 sudo firewall-cmd --reload对于Ubuntu# 查看防火墙状态 sudo ufw status # 如果需要启用ufw sudo ufw enable # 检查端口8888是否开放 sudo ufw allow 8888/tcp # 如果端口未开放添加规则 sudo ufw allow 8888/tcp # 重新加载防火墙规则 sudo ufw reload这样外界就可以通过IP地址和端口访问到对应的进程了 3.3 运行测试 测试之前我们先获取一个当前机器的IP地址 使用 curl 命令curl ifconfig.me使用 wget 命令wget -qO- ifconfig.me都可以获取到机器的外网IP 我们启动程序等待外部的链接 可以通过手机或者电脑的浏览器通过IP地址和端口号来进行访问 进行访问之后会获取到对应的信息 可以看到电脑WIndows系统和手机IPhone都成功的访问了我们的服务器非常cool 4 理解http请求与应答 4.1 宏观理解 请求和应答是http协议中双方都认识的结构化数据 一个基本的http请求的格式是这个样子的按行为单位 请求行指出请求类型如GET或POST、资源路径和使用的HTTP版本 方法Method表明对资源的请求类型如 GET获取资源、POST提交数据、PUT更新资源、DELETE删除资源等。URIUniform Resource Identifier请求的资源的路径例如一个网页的地址的后半部分。HTTP版本HTTP Version表明使用的HTTP协议版本如 HTTP/1.1 或 HTTP/2。 请求报头提供关于客户端环境和请求本身的信息如用户代理、接受的内容类型等。其中是以键值对的方式进行存储。空行请求报头和请求正文之间的分隔符。请求正文可选包含要发送给服务器的数据如表单数据。 http的应答与请求的格式很类似 状态行包含HTTP版本、状态码和状态消息。例如HTTP/1.1 200 OK 表示服务器成功处理了请求。响应报头提供关于响应的信息如内容类型、内容长度、服务器类型、设置Cookie等。例如空行响应报头和响应正文之间的分隔符。响应正文可选包含从服务器返回的实际内容如HTML页面、图片或其他数据。 知道了请求和报文的结构其本质上还是报文那么如何将其报头与有效载荷进行分离呢 我们看到的请求和应答的结构可以看到报头和报文是通过换行符进行分割的巧了我们之前不也是这样进行操作的吗而且只要有正文就会有对应的content-length:xxx来帮我我们判断正文的是否完整 4.2 http请求反序列化 接下来我们简单设计一下HttpRequesthttp请求的结构化数据 首先根据其整体的结构我们可以加入四个成员变量请求行 请求报头 空行 请求正文 // 设计http协议 class HttpRequest { public:HttpRequest(){}void Serialization(std::string reqstr){}void Deserialization(std::string reqstr){}~HttpRequest(){}private:std::string _req_line; // 请求行std::vectorstd::string _req_headers; // 请求报头std::string _blank_line; // 分割行std::string _req_body_text; // 正文 };这是最基本的四块数据我们先对这四部分进行反序列化。因为他们都是根据分隔符\r\n进行分割的字符串所以十分好处理 std::string GetLine(std::string reqstr){// 寻找分隔符auto pos reqstr.find(base_sep);if (pos std::string::npos)return std::string();std::string line reqstr.substr(0, pos);if (line.empty())return base_sep;// 在原字符串中删除reqstr.erase(0, base_sep.size() line.size());return line;}void Deserialization(std::string reqstr){// 进行反序列化_req_line GetLine(reqstr);//请求行do{std::string header GetLine(reqstr);if (header )break;else if (header base_sep)break;else_req_headers.push_back(header);} while (true);//请求报头_blank_line GetLine(reqstr);//空行_req_body_text GetLine(reqstr);//请求正文}这样就可以将一个字符串切分为四个部分了 接下来我们可以对数据进行进一步处理我们加入更加具体的成员变量 std::string _method; //请求方法std::string _url; //请求路径std::string _version;//版本std::unordered_mapstd::string , std::string _kv_headers;//报头处理很简单按照字符串结构编写代码即可 void ParseReqLine(){// 优雅的操作std::stringstream ss(_req_line);ss _method _url _version;}void ParseReqHeader(){for (auto header : _req_headers){auto pos header.find(line_sep);if (pos std::string::npos)continue;std::string k header.substr(0, pos);std::string v header.substr(pos line_sep.size());if (k.empty() || v.empty())continue;_kv_headers.insert(std::make_pair(k, v));}}void Deserialization(std::string reqstr){// 进行反序列化//...//----------------具体数据的处理-------------------ParseReqLine(); // 请求行的处理ParseReqHeader(); // 处理报头}我们可以将结果打印出来看看 非常好我们成功将reqstr进行了反序列化之后我们再来实现业务逻辑的代码 后续文章敬请期待
http://www.dnsts.com.cn/news/237460.html

相关文章:

  • 在哪个网站可以做二建的题在线做app
  • 深圳福田区住房和建设局网站官网膜结构行业做网站
  • 贵阳网站建设包首页网站制作素材
  • 订货系统如何获取网站的seo
  • 个人博客网站制作代码安装一个宽带多少钱
  • 找设计师网站南宁seo团队费用是多少
  • 选择大连网站建设高端自适应网站开发
  • wordpress快速仿站教程西宁做网站seo
  • 厦门网站建设价制作网页时要综合考虑哪些因素
  • 石家庄市住房和建设局网站怎么搭建小程序平台
  • 如何做视频网站 需要注意的地方网站开发与维护的相关大学
  • 怎样做服装网站企业邮箱登陆
  • 刷粉网站推广免费建设公关型的企业网站有哪些
  • 为农村建设网站报告一站式装修平台
  • 河北省水利建设市场网站wordpress表单统计插件下载
  • 城阳网站制作wordpress 显示当前位置
  • 哈尔滨网站制作维护网络广告策划书模板
  • 怎么知道网站的空间服务商遵义外国网站制作
  • 便利的微网站建设油管代理网页
  • 云南专业网站建设定制小程序多少钱
  • 专业企业网站搭建服务织梦是怎么做网站
  • 仿魔客吧网站模板网站建设个人实训报告
  • 邢台企业做网站报价做内贸什么网站资源比较多
  • 好的网页设计网站电子商务网站设计案例
  • 制作网站要多少钱企业网站推广内容
  • 怎样做视频电影网站南宁网络公司有哪些
  • 如何在年报网站上做遗失公告网站开发总结与收获
  • 爱站网域名查询手机 字体 wordpress
  • 帮人做网站在徐州被敲诈五万网站运营外包方案
  • 加强网站建设和维护工作抖音代运营会不会看到以往的数据