怎样买网站建设网站建设就业前景

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

怎样买网站建设,网站建设就业前景,动漫制作专业,苏州关键词优化平台目录 一、HTTP协议 1.http
2.url url的组成#xff1a; url的保留字符#xff1a; 3.http协议格式​编辑 ①http request ②http response 4.对request做出响应 5.GET与POST方法 ①GET ②POST 7.HTTP常见Header ①Content-Type:: 数据类型(text/html等)在上文…目录 一、HTTP协议 1.http  2.url url的组成 url的保留字符 3.http协议格式​编辑 ①http request ②http response 4.对request做出响应 5.GET与POST方法 ①GET ②POST 7.HTTP常见Header ①Content-Type:: 数据类型(text/html等)在上文我们使用过。 ②Content-Length: 正文的长度。 ③Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上。 ④User-Agent: 声明用户的操作系统和浏览器版本信息。 ⑤referer: 表示当前页面是从哪个页面跳转过来的。 ⑥Location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问。 ⑦Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能。 一、HTTP协议 1.http  上篇文章我们体验了定制协议的繁琐这次我们来讲述下真正成熟的有很多人使用的协议例如http、https、smtp、dns等。 Http协议超文本传输协议。 客户端通过使用Http协议来向服务端获取资源。 2.url 我们俗称的“网址”就是url。 协议方案名上例是http://表示使用http协议。后面我会讲到https这是http协议的加密版本现在多数都使用的都是https。 登录信息我们这次不考虑一般会省略掉在正文中携带登录信息。 服务器地址是资源所在的网站名或服务器的名字又称为域名。在网络通信中域名必须被转换为IP地址。 端口号HTTP 协议的默认端口是80如果省略了这个参数服务器就会返回80端口的网站。在上上一篇文章中讲到网络之间的通信就是进程之间的通信通过域名IP地址端口号的方式就可以在全网中确定唯一一个进程。我们发现一些url会缺省port一般由浏览器自动添加而这些url对应的port都是公开的一旦服务上线端口号就已经确定httpserver-80httpsserver-443,sshd-22。 文件路径资源在服务器的位置。 查询字符串提供给服务器的额外信息。 片段标识符也叫做锚点锚点是网页内部的定位点浏览器加载页面之后回滚到锚点锁定位的位置。 url的组成 26个英文字母 10个阿拉伯数字 连词号-句典. 下划线_ url的保留字符 有10个保留字符只能在给定位置出现。         如果在其他位置去使用保留字符就必须使用转义形式。 其中罗列一部分都是关于特殊符号的转义那我要在url中体现汉语怎么办 我们可以现场搜索一下见见实际情况。  我们会发现汉字也会被转义转义的规则为将需要转码的字符转换为16进制从右到左取四位每两位做一位前面加上%编码成%XY格式。  3.http协议格式 注意 method为请求方法常见的get方法、post方法。 key:空格value http/1.1为当前版本为1.1 现在我们可以通过上节课代码我们运行server通过浏览器来访问我们的server将接收到的东西打印出来我们就可以真正的见到http request。 ①http request 在浏览器中输入你主机的IP地址你的server绑定的端口号。 上图中关于服务器版本的信息当我们换个浏览器使用就会有不同的效果。 如图我是用iphone的safari浏览器依据我们的ip与port来访问的。 至于浏览器会表现出如此现象是因为我们做为服务器没有向浏览器响应发送任何东西。 上文的tcpserver的代码是上篇文章写的很是臃肿于是我删删减减得到了simple版本。 void handlerHttpRequest(int sock) {coutendl;char buffer[1024];ssize_t sz read(sock, buffer, sizeof(buffer));if (sz 0){cout buffer endl;} }class Tcpserver { public:Tcpserver(uint16_t port, const string ip ): _sock(-1), _port(port), _ip(ip){_quit false;}~Tcpserver(){if (_sock 0)close(_sock);}public:void init(){_sock socket(AF_INET, SOCK_STREAM, 0);if (_sock 0){exit(1);}struct sockaddr_in local;memset(local, 0, sizeof(local));local.sin_family AF_INET;local.sin_port htons(_port);_ip.empty() ? INADDR_ANY : (inet_aton(_ip.c_str(), local.sin_addr));if (bind(_sock, (const sockaddr *)local, sizeof(local)) 0){exit(2);}if (listen(_sock, 5) 0){exit(3);}}void start(){signal(SIGCHLD, SIG_IGN);while (!_quit){struct sockaddr_in peer;socklen_t len sizeof(peer);int servicesock accept(_sock, (struct sockaddr *)peer, len);if (_quit)break;if (servicesock 0){cerr accept error … endl;continue;}int clientport ntohs(peer.sin_port);string clientip inet_ntoa(peer.sin_addr);pid_t pid fork();assert(pid ! -1);if (pid 0){if (fork() 0)exit(4);handlerHttpRequest(servicesock);exit(0);}close(servicesock);wait(nullptr);}}void safequit(){_quit true;}private:int _sock;uint16_t _port;string _ip;// 安全退出bool _quit; };Tcpserver *svrp nullptr; void sighandler(int sig) {if (sig 3 svrp ! nullptr)svrp-safequit();cout server quit endl; } 上文我们可以看到http request的响应代码。接下来我们看一下http response的响应代码。 ②http response 接下来我们可以通过命令行的方式向baidu发送request获得response。 进入telnet后按ctrl]再按回车输入GET / HTTP/1.1然后按两下回车。  4.对request做出响应 上文我们对浏览器的request并没有做出任何响应server仅仅是将接收到的http request中的内容下文我们将对request做出响应。当然不是无所依据的responce我们可以参照上文百度做出的responce。 这个函数的参数神似我们使用过的write将flags设置为0就和write等价。 代码 void handlerHttpRequest(int sock) {char buffer[1024];ssize_t sz read(sock, buffer, sizeof(buffer));if (sz 0){cout buffer endl;}// response string response;response HTTP/1.0 200 OK\r\n; // response请求行response \r\n; // 本行为\r\n为请求报头与正文的分界线 请求报头暂且为空response Hello world!; // 正文send(sock,response.c_str(),response.size(),0); } 结果  单纯Hello world有点单一我们可以让它成为这个网页的大标题这个工作将由浏览器接收到我们的正文部分然后渲染就可以得到效果了。 代码 response htmlh1Hello world!/h1/html; // 正文 结果 再次升级我们将响应报头完善下。 Content-Type 内容类型 指出我们正文所对应的类型。 上文中的正文内容为.htmlContent-Type就应该填text/html。 具体的对照类型可以看这篇博客。 代码 // response string response;response HTTP/1.0 200 OK\r\n; // response请求行response Content-Type: text/html\r\n;response \r\n; // 本行为\r\n为请求报头与正文的分界线 请求报头暂且为空response htmlh1Hello world!/h1/html; // 正文结果跟上文无疑。 如何保证将响应行与响应报头读完整呢读到空行就可以保证。那如何保证正文读取完整呢这就是响应报头中的内容来保证的。 Content-Length负责记录正文的长度。 代码 // responsestring html htmlh1Hello world!/h1/html;string response;response HTTP/1.0 200 OK\r\n; // response请求行response Content-Type: text/html\r\n;response (Content-Length: to_string(html.size()) \r\n);response \r\n; // 本行为\r\n为请求报头与正文的分界线 请求报头暂且为空response html; // 正文 结果这次通过使用telnet来检验成果浏览器不会显示。 作为建设服务器的人员将网页构建的代码写到服务器中是否有点挫那应该放在什么地方先前我们在讲url的时候提到过文件路径由客户端依据文件路径请求资源服务器依据请求放回资源。所有我们的html等资源都是放在文件里。  至于文件路径是否要从linux根目录中开始写写到目标文件为止会写出很长一段文件路径。其实不用如果客户端要访问a/b/c.html我们能说a文件就是linux的根目录吗不能这是web根目录具体可以看下方代码。 request /a/b/c.html;path linux/server/web; // web根目录path request; -linux/server/web/a/b/c.html // 最终的文件路径 这次我们将我们的html放在文件中由客户端申请客户端返回。 我们的主页在当前工作路径下的wwwroot里。 代码 #define CRLF \r\n #define SPACE
#define SPACE_LEN strlen(SPACE) #define HOME_PAGE index.html #define WEB_ROOT ./wwwroot // 负责将http_request中的文件路径提取出来 string getPath(string http_request) {ssize_t pos http_request.find(CRLF);if (pos string::npos)return ;string request_line http_request.substr(0, pos);// GET /a/b/c http/1.1ssize_t firstSpace request_line.find(SPACE);if (firstSpace string::npos)return ;ssize_t secondSpace request_line.rfind(SPACE);if (secondSpace string::npos)return ;string path request_line.substr(firstSpace SPACE_LEN, secondSpace - (firstSpace SPACE_LEN));if (path.size() 1 path[0] /)path HOME_PAGE; // 如果只发了/ 我们就将我们网址的主页返回过去return path; } // 负责打开文件将文件的内容读取出来 string readFile(const string path) {ifstream in(path, std::ifstream::binary);if (!in.is_open())return 404;string content;string line;while (getline(in, line))content line;in.close();return content; } void handlerHttpRequest(int sock) {char buffer[10240];ssize_t sz read(sock, buffer, sizeof(buffer));if (sz 0){cout buffer;}string path getPath(buffer);cout path- path endl;string resource WEB_ROOT;resource path;cout resource- resource endl;string html readFile(resource);string response;response HTTP/1.0 200 OK\r\n; // response请求行response Content-Type: text/html\r\n;response (Content-Length: to_string(html.size()) \r\n);response \r\n; // 本行为\r\n为请求报头与正文的分界线 请求报头暂且为空response html; // 正文send(sock, response.c_str(), response.size(), 0); } index.html: !DOCTYPE html html head meta charsetutf-8 titlehttp server/title /head bodyh3TEST/h3pHello World!/p /body /html telnet中的结果无论是请求/ 还是/index.html 结果都一样因为我们当前只有一个主页。 web中的结果  5.GET与POST方法 ①GET 下面我们来鉴别POST方法与GET方法的区别。 我们都知道上网的行为一般分两种 1.从远端获取资源到本地 使用GET方法  //GET / HTTP/1.1  2.将本地的资源上传到远端 可以使用POST方法也可以使用GET方法。 我们这次使用表单将信息填写然后先用GET方法发送。 代码 !DOCTYPE html htmlheadmeta charsetutf-8titlehttp server/title /headbodyh3TEST/h3pHello World!/pform actionabc/qwe/index.html methodgetUsername: input typetext nameuserbrPassword: input typepassword namepasswdbrinput typesubmit valueSubmit/form /body/html 现象我们将信息填入点击submit 提交过后会发现会出现404那是因为网页代码中我们指定将数据提交的网址abc/qwe/index.html在服务器中并不存在。 我们主要来分析下当前的url。 我们会发现在HTTP协议中GET方法会以明文的方式 将我们对应的参数信息拼接到url中。 ②POST 下面来看看POST方法。 我们会发现GET方法中会将信息拼接在url中而POST方法不一样它是将信息拼接到http requset中的正文中。 总结 1. GET方法通过url传参 2. POST方法通过正文传参 3. GET方法传参不私密 4. POST方法传参通过正文相对私密。至于为什么不说安全与不安全HTTP协议在某种角度来说就是不安全的不管通过GET还是POST方法提交数据都会通过抓包等软件获取到url或者正文所以说都是不安全的下面我们会学习HTTPS现在主流安全可靠的协议。 5. 网页中内容较少一般通过GET方法传参内容较多通过POST方法传参。 6.HTTP状态码 最常见的状态码比如200(OK),404(Not Found),403(Forbidden),302(Redirect,重定向),504(Bad Gateway)。  我们向服务器申请一个并不存在的资源将会返回什么状态码呢 会返回4XX因为客户端申请的资源并不存在服务器就算穷举也找不到所以这是客户端出错。 什么时候会返回5XX呢 客户端申请一些任务服务器去执行在其中会申请内存线程进程等手段执行任务当服务器中一些资源到达载荷就会返回5XX。 我们主要研究下3XX。      客户端向服务端发起请求服务端响应中携带301 || 302 和new url浏览器就会自动跳转到新的服务端去获得资源。         我们通过我们简单的代码也可以验证下。 代码 void handlerHttpRequest(int sock) {char buffer[10240];ssize_t sz read(sock, buffer, sizeof(buffer));if (sz 0){cout buffer;}string response HTTP/1.1 302 Moved Temporarily\r\n;response Location: www.baidu.com\r\n;response \r\n;send(sock, response.c_str(), response.size(), 0); } 现象 至于为什么没有显示我们重定向之后的页面呢因为浏览器作为客户端并行的向我们的服务端发送请求服务端则是向每一个请求都返回重定向所以会显示出图片中的错误。 当然我们此时也没有完全写对Location之后一定跟的是网址。写成www.baidu.com只是目前的站内跳转要实现不同的域也就是服务器跳转代码要变成 response Location: https://www.baidu.com/rn; 现象将IP地址和端口输入回车之后就会跳转到我们重定向之后的界面。 什么时候会用到301或者302呢 301作为永久重定向一般是在网站更换网址时使用比如当时的url取的很随意当想改变跟换一个更好听的时候会发现当前访问旧网址的人很多为了避免再换url时损失大量用户可以在用户访问旧url时使用永久重定向跳转到新的url。 302作为临时重定向当该网站临时维护时不想拒绝访问的用户可以用到临时重定向使网站跳转到另一个可以提供服务的网站。 7.HTTP常见Header ①Content-Type:: 数据类型(text/html等)在上文我们使用过。 ②Content-Length: 正文的长度。 ③Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上。 ④User-Agent: 声明用户的操作系统和浏览器版本信息。 我们通过Windows环境下的浏览器打开qq的官网观察下载页面会发现下载页面直接为Windows版本下载。 通过手机浏览器打开qq的官网会发现下载页面会变为qq手机版。 这是依据什么来改变响应界面呢与User-Agent这个信息密切相关。 ⑤referer: 表示当前页面是从哪个页面跳转过来的。 ⑥Location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问。 ⑦Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能。 在讲Cookie之前我们要知道HTTP协议的特点之一是无状态什么是无状态呢简单就是HTTP协议本事并不会记录你请求资源的行为请求过了再请求HTTP协议本事并不会记录你当前已经请求过了。但是我们当前所知道的浏览记录等信息都是显而易见被记录下来的信息这些信息都是依靠HTTP周边策略来实现的比如说Cookie策略。 这个Cookie在哪其作用呢 像我们每次登入一个常用的网站关闭之后再次进入会发现登陆的账号还在保持登陆状态这就是cookie起了作用当我们禁止cookie就会发现每次登陆之后关闭再打开会让你再次登陆并不会延续你上次登陆的用户。 我们尝试讲Cookie体现在代码中 代码 现象 一般流程为我们客户端讲登陆信息输入登录信息就会被记录到服务器中当再次访问网站时 登陆信息就会通过Set-Cookie发送到客户端。 当然Cookie不仅仅是存在于服务端也有可能存在于浏览器维护的文件中。 我的登录信息这么简单的存储在本地文件中那木马病毒等不正当手段随便就可以获取我的登陆信息岂不是我的上网安全岌岌可危所以我们要使用Cookie和Session组合起来的方式来保证安全。 客户端输入登陆信息然后将登陆信息发给服务端服务端根据登陆信息形成Session文件该文件的文件名具有唯一性该文件名被称为session_id。服务端再将该session_id发给客户端客户端会将session_id写入本地的cookie中。在cookie中的表现只出现session_id。下次登陆时客户端就会将session_id发送给服务端服务端依据session_id来判断是否有权利享有对应的资源。 那这个session_id会不会也会被轻易盗取也是会的这个问题没有根本解决。但是session_id丢掉之后你丢掉的只是session_id你的信息会保存在服务端。大型的服务端有很不错的防护系统。至于更多的知识感兴趣的同学可以去了解一下更细致的讲解。 关于Cookie和Session的要点 Cookie的Expires属性指定了cookie的生存期默认情况下coolie是暂时存在的他们存储的值只在浏览器会话期间存在当用户退出浏览器后这些值也会丢失如果想让cookie存在一段时间就要为expires属性设置为未来的一个过期日期。现在已经被max-age属性所取代max-age用秒来设置cookie的生存期。因此当没有设定过期时间时则退出当前会话时cookie失效。 Session可以存放各种类别的数据相比只能存储字符串的cookie能给开发人员存储数据提供很大的便利。 SessionID可以存储每个用户Session的代号是一个不重复的长整型数字。 单个cookie保存的数据不能超过4K很多浏览器都限制一个站点最多保存20个cookie。 目前此篇文章就写到这里关于HTTPS协议将会在下篇与大家见面如有错误请指出感谢观看我们下次再见。