前端本质
cs and bs
cs模式是指服务端客户端关系,客户端有浏览器,电子邮件客户端等 基于TCP协议(udp) socket与tcp协议的关系 socket是对tcp/udp的封装,是网络层传输层和应用层的接口 bs模式 浏览器本身就是客户端
http协议:短链接,一次发送接收即断开
cs模式是指服务端客户端关系,客户端有浏览器,电子邮件客户端等 基于TCP协议(udp) socket与tcp协议的关系 socket是对tcp/udp的封装,是网络层传输层和应用层的接口 bs模式 浏览器本身就是客户端 http:属于应用层,基于ip+tcp/udp 请求协议:浏览器发往服务器 关键字竞价排名,点击进入网站,根据用户点击地址完成一次完整的排名计价。 盗链与反盗链:资源在别的地方,但是点击量集中在自己网站,做自己的广告。就可以查看Referer,如果不对,转到其他页面 或者转入自己的网站,必须在我自己网站上使用资源,才能下载。 请求首行; // 请求方式,请求路径,协议和版本,例如:GET /index.html HTTP/1.1 请求头信息;// 请求头名称:请求头内容,即为字典key:value格式,例如:Host:localhost Host:127.0.0.1:8000 Connection:keep-alive 保持连接状态 User-Agent:Mozilla/5.0 用户代理一般为浏览器 Accept:text/html 支持类型 Accept-Encoding:gzip,br 支持编码 Accept-Language:zh-CN,zh可接受语言 Referer:http://127.0.0.1:8080 进入的入口地址 Cookie:浏览器字典格式,存储密码等,保存状态 空行; // 用来与请求体分隔开 请求体。 // GET没有请求体,只有POST有请求体。 get:url+参数 访问网址是get,提交默认get一般使用post为了安全 post:当地址栏太长参数不够用的时候,用post安全,大小无限制 HTTP默认的请求方法就是GET * 没有请求体 * 数据必须在1K之内! * GET请求数据会暴露在浏览器的地址栏中 GET请求常用的操作: 1. 在浏览器的地址栏中直接给出URL,那么就一定是GET请求 2. 点击页面上的超链接也一定是GET请求 3. 提交表单时,表单默认使用GET请求,但可以设置为POST POST: (1). 数据不会出现在地址栏中 (2). 数据的大小没有上限 (3). 有请求体 (4). 请求体中如果存在中文,会使用URL编码! ?(1)连接作用:连接页面地址和参数(2)清除缓存:不调用缓存的内容,而认为是一个新地址,重新读取,比如引用样式表后加? & 主要是get请求连接参数比如name=adamanter&age=24 响应协议:服务器发往浏览器 响应首行:HTTP/1.1 200 OK:响应协议为HTTP1.1,状态码为200,表示请求成功,OK是对状态码的解释; 响应头信息: Server:WSGIServer/0.2 CPython/3.5.2:服务器的版本信息; Content-Type: text/html;charset=UTF-8:响应体使用的编码为UTF-8; Content-Length: 724:响应体为724字节; Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello:响应给客户端的Cookie; Date: Wed, 25 Sep 2012 04:15:03 GMT:响应的时间,这可能会有8小时的时区差; Request URL:http://127.0.0.1:8090/login/ Request Method:GET Status Code:200 OK Remote Address:127.0.0.1:8090 Response Headers view source Content-Type:text/html; charset=utf-8 Date:Wed, 26 Oct 2016 06:48:50 GMT Server:WSGIServer/0.2 CPython/3.5.2 空行:分隔响应头和响应体 响应体: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="post"> 用户名:<input type="text" name="username"/> <input type="submit" value="提交"/> </form> </body> </html> apache nginx:解析http 状态码:200成功 302 重定向 需要重发请求 500以上基本都是服务器错误 200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中; 404:请求的资源没有找到,说明[客户端错误]的请求了不存在的资源; 302:重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址; 304: 重定向,Last-Modified 存储服务器端修改的时间,如果是上次修改时间说明没变,就直接才能从缓存中取出来 500:请求资源找到了,但服务器内部出现了错误; 其他响应头: 告诉浏览器不要缓存的响应头: Expires: -1; Cache-Control: no-cache; Pragma: no-cache; 自动刷新响应头,浏览器会在3秒之后请求http://www.baidu.com: Refresh: 3;url=http://www.baidu.com HTML中指定响应头 在HTMl页面中可以使用<meta http-equiv="" content="">来指定响应头, 例如在index.html页面中给出<meta http-equiv="Refresh" content="3;url=http://www.baidu.com">, 表示浏览器只会显示index.html页面3秒,然后自动跳转到http://www.baidu.com. GET /favicon.ico HTTP/1.1 Host: 127.0.0.1:8080 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36 Accept: */* Referer: http://127.0.0.1:8080/ Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8 Cookie: sessionid=e0ci3j4mwkg8itrtr5so824raj8wilfk; Http协议: 一 请求协议 (浏览器------>server) url: www.baidu.com?a=1 (1)请求首行 GET /favicon.ico HTTP/1.1 (2)请求头信息 Host: 127.0.0.1:8080 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36 Accept: text/html Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8 Referer: http://127.0.0.1:8080/ Cookie: sessionid=e0ci3j4mwkg8itrtr5so824raj8wilfk; csrftoken=0nNXMorXRmbll9pDD1mEWAlUmqPLPDOMvY5zQvRawcbXyuiuSaYtTGkzQUB5XfPF (3) 空行 (4)请求体(请求数据)----------------get请求体不存在 二 响应协议(server-----------》浏览器) 响应首行; HTTP/1.1 200 OK 响应头信息; 空行; 响应体。
socket+http模拟发送信息
# 这段代码就是开启服务,浏览器最重要额就是sendall(),里面要加入http协议 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost',8083)) sock.listen(5) while True: print("server is working.....") conn, address = sock.accept() request = conn.recv(1024) with open("index.html") as f: data=f.read() # conn.sendall(bytes("<h1>Hello</h1>","utf8")) 不成功 # conn.sendall(bytes("HTTP/1.1 201 OK\r\n\r\n<h1>Hello Yuan</h1>", "utf8")) conn.sendall(b"HTTP/1.1 201 OK\r\n\r\n<h1>Hello ALEX</h1>", "utf8") conn.sendall(b"HTTP/1.1 201 OK\r\n\r\n%s"%data.encode("utf8")) conn.close() if __name__ == '__main__': main()