HTTTP协议

HTTP协议(超文本传输协议)

用途:网页的传输,数据传输
特点:应用层协议,传输层使用tcp服务,简单,灵活,无状态,请求类型多样,数据格式支持全面,

  • HTTP请求格式
  1. 请求行:具体的请求类型和请求内容
    格式:GET / HTTP/1.1
    请求类别 请求内容 协议版本
    请求类别:每个请求类别表达不同的请求方式和行为

     	GET :获取网络资源
     	POST :提交一定的信息,得到反馈
     	HEND :只获取网络资源响应头
     	PUT :更新服务器资源
     	DELETE :删除服务器资源
     	CONNECT :
     	TRACE :测试
     	OPTIONS :获取服务器性能信息
    
  2. 请求头:对请求的进一步描述和解释

  3. 空行:

  4. 请求体:请求的参数或者提交内容

  • HTTP响应(response)
  1. 响应格式:响应行,响应头,空行,响应体
  2. 响应行:反馈基本的响应情况
    HTTP/1.1 200 OK
    协议版本 响应码 附加信息
    响应码:1XX 提示消息,请求被接受
    2XX 响应成功
    3XX 响应需要进一步处理
    4XX 客户端错误
    5XX 服务端错误
"""
http server 1.0
接收浏览器请求
将固定的网页发送给浏览器
"""
from socket import * 

# 处理客户端请求
def handle_request(connfd):
    print("Request from:",connfd.getpeername())
    request = connfd.recv(4096) # 接收request
    # 获取请求行
    request_lines = request.splitlines()
    for line in request_lines:
        print(line)
    
    # 返回固定网页给浏览器
    try:
    	#自己写的网页
        f = open('index.html')
    except IOError:
        response = "HTTP/1.1 404 Not Found\r\n"
        response += '\r\n'
        response += '==Sorry not found==' 
    else:
        response = "HTTP/1.1 200 OK\r\n"
        response += '\r\n'
        response += f.read()
        f.close()
    finally:
        # 将结果给浏览器
        connfd.send(response.encode())
        
           
# 创建套接字
def main():
    sockfd = socket()
    sockfd.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
    sockfd.bind(('0.0.0.0',8000))
    sockfd.listen(3)
    print("Listen the port 8000...")
    while True:
        connfd,addr = sockfd.accept()
        handle_request(connfd) # 具体请求处理
        connfd.close()

if __name__ == "__main__":
    main()
  • IO
  1. 定义:在内存中存在数据交换的操作认为是IO操作
    e.g. 和终端交互:input print
    和磁盘交互:read write
    和网络交互:recv send
    IO 密集型:在程序中存在大量的IO,而CPU运算较小,消耗CPU资源小,耗时长,效率不高
    计算密集:在运行中存在大量计算操作,IO行为较少,CPU消耗大,执行速度快

  2. IO模型: 阻塞IO ,非阻塞IO,IO多路复用

  3. 阻塞IO

    定义: 在执行IO操作时由于不满足某些条件形成的阻塞形态。阻塞IO是IO的默认行为。

    效率:阻塞IO是一种效率很低的IO。逻辑简单

    阻塞情况
    * 因为某种条件没有达到形成的阻塞
    e.g. accept input recv

      * 处理IO的时间较长产生的阻塞情况
        e.g. 网络传输,大文件的读写过程
    
  4. 非阻塞IO

    定义 : 通过修改IO的属性行为,使原本阻塞的IO变为非阻塞的状态
    设置套接字为非阻塞IO

     sockfd.setblocking(bool)
     功能: 设置套接字为非阻塞IO
     参数:True表示套接字IO阻塞,False表示非阻塞
    

    设置超时检测 : 阻塞等待指定的时间,超时后则不再阻塞。

     sockfd.settimeout(sec)
     功能: 设置套接字超时时间
     参数:超时时间 
    
  5. IO多路复用
    定义:同时监控多个IO事件,当哪个IO事件准备就绪就执行哪个IO,以此形成可以同时处理多个IO的行为,
    避免一个IO阻塞造成的其他IO无法执行,提高IO执行效率

    具体方案

     	select:windows linux  unix
     	poll:linuxx unix
     	eepoll:linux
    

    python实现:import select
    rs,ws,xs = select(rlost,wlist,xlist[,tineout])
    功能:监控多个IO事件,阻塞等待发生
    参数: rlist 列表 存放关注的等待发生的IO事件
    wlist列表 存放要主动处理的IO事件
    xlist列表 存放发生异常时要处理的IO事件

     返回值:rs 列表	rlist中准备就绪的IO
     	ws 列表	wlist中准备就绪的IO
     	xs 列表	xlist中准备就绪的IO
     wlist中如果有IO事件,则select会立即返回给ws
     处理IO事件过程中不要出现死循环等长期占有服务端情况
     IO多路复用消耗资源较少,效率更高
    
# 重要

from select import select 
from socket import *

# 创建套接字作为关注的IO 
s = socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(('0.0.0.0',8800))
s.listen(5)

# 添加到关注列表
rlist = [s]
wlist = []
xlist = []

while True:
    # 监控IO
    rs,ws,xs = select(rlist,wlist,xlist)
    for r in rs:
        # s就绪说明有客户端连接
        if r is s:
            c,addr = r.accept()
            print("Connect from",addr)
            # 将客户端套接字加入关注列表
            rlist.append(c)
        # 如果是c就绪则表示对应的客户端发送消息
        else:
            data = r.recv(1024)
            if not data:
                rlist.remove(r)
                r.close()
                continue
            print(data.decode())
            # r.send(b'OK')
            # 当r放入wlist中表示希望主动处理
            wlist.append(r)

    for w in ws:
        w.send(b'OK')
        wlist.remove(w)
    
    for x in xs:
        pass 

  • 四. 位运算

    定义 :将整数转换为二进制,按二进制位进行运算

    运算符号: & 按位与
    | 按位或
    ^ 按位异或
    << 左移
    >> 右移

    e.g.  14  -->  01110
        	 19  -->  10011
      		 25 ——>  11001
    
    14 & 19 = 00010 = 2    一0则0
    14 | 19 = 11111 = 31   一1则1
    14 ^ 19 = 11101 = 29  相同为0不同为1
    14 << 2 = 111000 = 56  向左移动右侧补0
    19 >> 2 = 100 = 4   向右移动去掉低位
    25 >> 3 = 11 = 3 
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值