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

php驾校网站源码丽江市企业网站

php驾校网站源码,丽江市企业网站,电商app开发费用,东莞营销推广公司文章目录 http的方法http状态码http重定向http常见Header实现简单业务逻辑Protocol.hppUtil.hppServer.hppServer.cc 效果 http的方法 方法说明支持的HTTP版本GET获取资源1.0/1.1POST传输实体主体1.0/1.1PUT传输文件1.0/1.1HEAD获得报文首部1.0/1.1DELETE删除文件1.0/1.1OPTIO… 文章目录 http的方法http状态码http重定向http常见Header实现简单业务逻辑Protocol.hppUtil.hppServer.hppServer.cc 效果 http的方法 方法说明支持的HTTP版本GET获取资源1.0/1.1POST传输实体主体1.0/1.1PUT传输文件1.0/1.1HEAD获得报文首部1.0/1.1DELETE删除文件1.0/1.1OPTIONS询问支持方法1.1TRACE追踪路径1.1CONNECT要求用隧道协议连接代理1.1LINK建立和资源之间的联系1.0UNLINE断开连接关系1.0 其中最为常见的请求方法为GET POST 事实上浏览器向服务器进行数据提交时本质是前端通过form表单提交的浏览器会自动将form表单中的内容转换为GET/POST的方法请求 例如在QQ的网址上会有登陆框查看登陆框的源代码就会发现有form表单 如果输入了账号密码之后点击了登陆按钮浏览器就会将账号和密码根据指定的GET或者POST方法发送给服务器。 其中两者的区别有 GET方法会将获取到的数据作为参数直接通过url 传递也就是说GET方法会在url 上直接显示出数据格式为http://ip:port/XXX/YY?namevaluename2value2。会直接暴露出数据POST方法不是通过url 传递数据而是直接向请求的正文里提交数据。也就是说参数会存在在正文里服务器再从正文里提取参数因为GET方法是再url中直接传递参数所以参数不能太大POST在正文传递参数所以可以参数很大 需要注意的是 虽然POST方法不会暴露数据但是并不意味着就是安全的。私密 ! 安全。 如果要谈到安全那就必须要加密加密内容属于https协议 http状态码 类别原因1XXinformational - 信息性状态码接受的请求正在处理2XXsuccess - 成功状态码请求正常处理完毕3XXredirection - 重定向状态码需要进行附加操作以完成请求4XXclient error - 客户端错误状态码服务器无法处理请求5XXserver error - 服务端错误状态码服务器处理请求出错 其中最常见的就是 404 网页不存在 200 代表OK404 Not Found403 Forbiden302 Redirect 重定向504 Bad Gateway http重定向 要实现重定向其实很简单将状态码修改为307代表重定向然后在正文里加入重定向的网址即可这样向服务器请求后服务器就会将处理的请求重定向到指定的网址 // 服务端处理的回调函数 bool func(const HttpRequest req, HttpResponse res) {// 打印方便调试查看接收到的数据是否正确cout ---------------http-------------- endl;cout req._inbuffer;cout _method: req._method endl;cout _url: req._url endl;cout _httpversion: req._httpversion endl;cout _path: req._path endl;cout _suffix: req._suffix endl;cout _size: req._size endl;cout ---------------end--------------- endl;// 状态行// string resline HTTP/1.1 200 OK\r\n;string resline HTTP/1.1 307 Temporary Redirect\r\n;// 响应报头// 需要注意正确的给客户端返回资源图片是图片网页是网页string rescontet Util::suffixToDesc(req._suffix);// 添加资源长度到报头rescontet Content-Length: ;rescontet to_string(req._size);rescontet \r\n;// 添加重定向rescontet Location: https://www.qq.com/\r\n;// 空行string resblank \r\n;// 响应正文string body;// 判断资源是否存在不存在就返回错误状态码 - 404if (!Util::FileIsNo(req._path, body)){Util::FileIsNo(errorhtml, body);}// 写回响应的数据后续要发送回客户端res._outbuffer resline;res._outbuffer rescontet;res._outbuffer resblank;res._outbuffer body;return true; }http常见Header 名称意义Content-Type数据类型(text/html等)Content-LengthBody的长度Host客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上User-Agent声明用户的操作系统和浏览器版本信息referer当前页面是从哪个页面跳转过来的location搭配3xx状态码使用, 告诉客户端接下来要去哪里访问 – 重定向Cookie用于在客户端存储少量信息. 通常用于实现会话(session)的功能 实现简单业务逻辑 代码里涉及html代码不详细讲解 由于服务器较弱所以图片获取直接从网址获取不从服务器读取 需要注意一个网页看到的结果可能是有多个资源组合而成例如有网页图片视频等。所以要获取一张完整的网页效果需要浏览器发送多次请求那么服务器就要根据请求的类型不同对响应正文处理的方式要指明Content-Type的类型。例如网页为“text/html”jpg格式的图片为“image/jpeg”不同的格式可自行搜索 判断格式的方法可以根据 url 中资源的后缀进行判断 以下代码均有注释 Protocol.hpp 请求响应类 因为浏览器会自动处理收到的响应报文所以不需要编写处理方法只需要将响应报文发送回浏览器即可 #pragma once#include iostream #include string #include sstream #include Util.hppusing namespace std;// 定义分隔符 #define sep \r\n #define default_root ./wwwroot #define home_page index.html #define errorhtml ./wwwroot/404.html// 请求 class HttpRequest { public:string _inbuffer; // 接收请求数据string _method; // 处理数据方法的名称string _url; // urlstring _httpversion; // http协议版本string _path; // 查找资源的路径string _suffix;// 资源后缀int _size;//资源长度HttpRequest(){}// 处理收到的数据// 添加默认路径void parse(){// 拿到第一行string line Util::GetOneLine(_inbuffer, sep);if(line.empty())return;cout line: line endl;// 拿到第一行中的三个字段stringstream ss(line);ss _method _url _httpversion;// 添加默认路径_path default_root;_path _url;// 如果url为/ 则添加默认路径if(_path[_path.size() - 1] /)_path home_page;// 获取资源的后缀auto pos _path.rfind(.);if(pos string::npos)_suffix .html;else_suffix _path.substr(pos);// 获取到长度_size Util::GetLen(_path);}};// 响应 class HttpResponse { public:string _outbuffer; };Util.hpp 工具类将共有的方法定义同个类方便调用 #pragma once#include iostream #include string #include fstream #include sys/types.h #include sys/stat.h #include unistd.husing namespace std;class Util { public:// 提取并删除首行// 读到的首行并不需要处理static string GetOneLine(string inbuffer, const string sep){auto pos inbuffer.find(sep);if (pos string::npos)return ;string sub inbuffer.substr(0, pos);inbuffer.erase(0, sub.size() sep.size());return sub;}// 判断请求的资源是否存在static bool FileIsNo(const string resource, string *out){ifstream in(resource);// 打开文件失败说明资源不存在if (!in.is_open())return false;string line;while (getline(in, line))*out line;in.close();return true;}// 根据后缀指明响应报头类型static string suffixToDesc(const string suffix){string st Content-Type: ;if (suffix .html)st text/html;else if (suffix .jpg)st image/jpeg;st \r\n;return st;}// 获取资源的长度static int GetLen(const string path){struct stat s;int n stat(path.c_str(), s);if(n 0)return s.st_size;return -1;} };Server.hpp #pragma once#include Protocol.hpp #include sys/types.h #include sys/socket.h #include cstring #include netinet/in.h #include arpa/inet.h #include functional #include sys/wait.h #include unistd.husing func_t functionbool(const HttpRequest , HttpResponse );class Server { public:Server(func_t func, uint16_t port): _port(port), _func(func){}void Init(){// 创建负责监听的套接字 面向字节流_listenSock socket(AF_INET, SOCK_STREAM, 0);if (_listenSock 0)exit(1);// 绑定网络信息struct sockaddr_in local;memset(local, 0, sizeof(local));local.sin_family AF_INET;local.sin_port htons(_port);local.sin_addr.s_addr INADDR_ANY;if (bind(_listenSock, (struct sockaddr *)local, sizeof(local)) 0)exit(3);// 设置socket为监听状态if (listen(_listenSock, 5) 0)exit(4);}// 服务端读取处理请求方法void HttpHandler(int sock){// 确保读到完整的http请求char buffer[4096];size_t n recv(sock, buffer, sizeof(buffer) - 1, 0);HttpRequest req;HttpResponse res;if (n 0){buffer[n] 0;req._inbuffer buffer;// 处理读到的数据req.parse();// 调用回调方法反序列化请求并得到响应结果和序列化响应结果_func(req, res);// 发回客户端send(sock, res._outbuffer.c_str(), res._outbuffer.size(), 0);}}void start(){while (1){// server获取建立新连接struct sockaddr_in peer;memset(peer, 0, sizeof(peer));socklen_t len sizeof(peer);// 创建通信的套接字// accept的返回值才是真正用于通信的套接字_sock accept(_listenSock, (struct sockaddr *)peer, len);if (_sock 0)continue;cout sock: _sock endl;// 利用多进程实现pid_t id fork();if (id 0) // child{close(_listenSock);// 调用方法包括读取、反序列化、计算、序列化、发送HttpHandler(_sock);close(_sock);exit(0);}close(_sock);// fatherpid_t ret waitpid(id, nullptr, 0);}}private:int _listenSock; // 负责监听的套接字int _sock; // 通信的套接字uint16_t _port; // 端口号func_t _func; };Server.cc #include Server.hpp #include memory// 输出命令错误函数 void Usage(string proc) {cout Usage:\n\t proc local_ip local_port\n\n; }// 服务端处理的回调函数 bool func(const HttpRequest req, HttpResponse res) {// 打印方便调试查看接收到的数据是否正确cout ---------------http-------------- endl;cout req._inbuffer;cout _method: req._method endl;cout _url: req._url endl;cout _httpversion: req._httpversion endl;cout _path: req._path endl;cout _suffix: req._suffix endl;cout _size: req._size endl;cout ---------------end--------------- endl;// 状态行string resline HTTP/1.1 200 OK\r\n;// string resline HTTP/1.1 307 Temporary Redirect\r\n;// 响应报头// 需要注意正确的给客户端返回资源图片是图片网页是网页string rescontet Util::suffixToDesc(req._suffix);// 添加资源长度到报头rescontet Content-Length: ;rescontet to_string(req._size);rescontet \r\n;// // 添加重定向// rescontet Location: https://www.qq.com/\r\n;// 空行string resblank \r\n;// 响应正文string body;// 判断资源是否存在不存在就返回错误状态码 - 404if (!Util::FileIsNo(req._path, body)){Util::FileIsNo(errorhtml, body);}// 写回响应的数据后续要发送回客户端res._outbuffer resline;res._outbuffer rescontet;res._outbuffer resblank;res._outbuffer body;return true; }int main(int argc, char *argv[]) {// 启动服务端不需要指定IPif (argc ! 2){Usage(argv[0]);exit(1);}uint16_t port atoi(argv[1]);unique_ptrServer server(new Server(func, port));// 服务端初始化server-Init();// 服务端启动server-start();return 0; }效果 在此就不写出html的文件了看着效果能够实现即可 可以看到浏览器向服务器发送请求服务器返回响应响应里就包括了自己编写的html文件所以浏览器处理后就显示出了自己的网页
http://www.hkea.cn/news/14431298/

相关文章:

  • 简述织梦网站上传步骤沈阳城市建设学院官网网站
  • 西安免费做网站价格有哪些线上做酒店的网站
  • 做设计需要素材的常用网站德州市住房建设局网站
  • 怎么改版一个网站win7和WordPress的关系
  • 给女朋友做的网站内容广告设计软件哪个好
  • 青海省教育厅门户网站北京app外包公司哪家好
  • 衡水精品网站建设黑龙江建设部网站
  • 宜兴建设局网站拖拽式wordpress建站
  • 免费网站空间注册万户网站制作
  • 企业网站制作教程视频wordpress 您没有足够的权限
  • 中国咖啡网站建设方案wordpress厨房家居主题
  • 网站建设的栏目内容网页制作步骤图文
  • 网站关键词排名分析seo新站如何快速排名
  • 淘宝上做网站怎么样苏州高端网站定制
  • 无锡产品排名优化seo基础知识
  • g2g有哪些网站品牌网络授权书
  • 大连网站建设方案案例传媒公司vi
  • 注册德国网站域名网站建设与管理试卷 判断题
  • 网站欢迎框代码wordpress 开玩笑 呵
  • 数码产品简约大气网站设计临沂网站建设对实体企业的重要性
  • 汕尾东莞网站建设新乡手机网站建设哪家好
  • 电子商务网站制作教程WordPress随机句子
  • html5网站搭建企业网站不足
  • 做网站需要哪些工程师东莞网络推广怎么样
  • 网站如何带来流量做写手一般上什么网站
  • 在线简历免费制作网站58网站自己做
  • 网站设计项目明细网件路由器无线桥接
  • 整站优化多少钱软件研发租用网站怎么做分录
  • 湛江手机网站建设公司wordpress主题格式
  • 网站程序 wordpress 织梦 discuzwordpress 页面 置顶