前端本质

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()

  

 

posted @ 2017-09-21 15:54  Adamanter  阅读(145)  评论(0编辑  收藏  举报