http协议与服务器

http协议与服务器


目标:
* 知道HTTP协议是为了实现浏览器和服务器之间的通信
* 会说出http协议的三次握手四次挥手
* 可以说出请求报文包含请求行、请求头、空行、请求体
* 知道响应报文包含响应行、响应头、空行、响应体
* 知道http请求、响应的格式
* 知道长连接、短链接的区别


基本语法

  • http格式:每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。

  • 【面】http三次握手四次挥手

    http协议与服务器_第1张图片

回答:
三次握手过程:
1 首先客户端向服务端发送一个带有 SYN 标志,以及随机生成的序号 100(0 字节)的报文
2 服务端收到报文后返回一个报文(SYN200(0 字节),ACk1001(字节+1))给客户端
3 客户端再次发送带有 ACk 标志 201(字节+)序号的报文给服务端
   至此三次握手过程结束,客户端开始向服务端发送数据

四次挥手过程:
由于 TCP 连接是可以双向通信的(全双工),因此每个方向都必须单独进行关闭(这句话才是
精辟,后面四个挥手过程都是其具体实现的语言描述) 四次挥手过程,客户端和服务端都可以先开始断开连接
1 客户端发送带有 fin 标识的报文给服务端,请求通信关闭
2 服务端收到信息后,回复 ACK 答应关闭客户端通信(连接)请求 3 服务端发送带有 fin 标识的报文给客户端,也请求关闭通信
4 客户端回应 ack 给服务端,答应关闭服务端的通信(连接)请求
  • 【面】http常见状态码
通过状态码告诉客户端服务器的执行状态,以判断下一步该执行什么操作。 常见的状态机器码有: 100-199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。 200-299:表示服务器成功接收请求并已完成处理过程,常用 200(OK 请求成功)。 300-399:为完成请求,客户需要进一步细化请求。302(所有请求页面已经临时转移到新的 url)。 304、307(使用缓存资源)。
400-499:客户端请求有错误,常用 404(服务器无法找到被请求页面),403(服务器拒绝访问, 权限不够)。
500-599:服务器端出现错误,常用 500(请求未完成,服务器遇到不可预知的情况)。
  • 【面】长连接、短链接
在HTTP/1.0中默认使用短连接,从HTTP/1.1起,默认使用长连接,用以保持连接特性.在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接,实现长连接需要客户端和服务端都支持长连接.
  • 相关代码(方便以后复习查看):
def service_client(new_socket):
    # 接收浏览器发送的请求
    request = new_socket.recv(1024).decode("utf-8")
    request_lines = request.splitlines()
    # 写正则匹配数据
    ret = re.match(r"[^/]+(/[^ ]*)",request_lines[0])
    file_name = ""
    if ret:
        file_name = ret.group(1)
        if file_name == "/":
            file_name = "/index.html"
    content = ""
    try:
        with open("./html"+file_name,"rb") as f:
            content = f.read()
            print(content)
    except:
        response = "HTTP/1.1 400 NOT FOUND\r\n"  # \r\n换行
        response += "\r\n"  # 空行
        new_socket.send(response)
    else:
        # 返回数据
        response = "HTTP/1.1 200 OK\r\n"  # \r\n换行
        response += "\r\n"  # 空行
        # response += "haha"
        new_socket.send(response.encode("utf-8"))
        new_socket.send(content)
    new_socket.close()


# 端口重复使用
 tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 设置套接字为非堵塞的方式
 tcp_server_tcp.setblocking(False)  

  • 代码常犯问题:
    • TypeError: cannot use a string pattern on a bytes-like object

      接收到客户端信息时,需要将字节转换成str再进行匹配,即:request = new_socket.recv(1024).decode(“utf-8”)
    • a bytes-like object is required, not 'str'

      发送给客户端信息时,需要将str转换成字节再发送,即:new_socket.send(response.encode(“utf-8”))
    • 引入from socket import * 时,调用了setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1),代码不执行
      改用import socket,因为SOL_SOCKET、SO_REUSEADDR在另外一个模块中
    • 多线程实现tcp聊天,报错:OsError错误
      线程执行任务时,任务没执行完socket关闭了,需等待线程执行完再关闭

你可能感兴趣的:(python)