1. HTTP协议
    定义:超文本文件传输协议(https: 代表加密) ,协议规定了双方之间传送数据的格式
    理解:http协议主要是浏览器与服务器之间的交互;浏览器的底层是socket套接字
    验证:使用网络调试助手给浏览器发送给数据
  2. http协议的请求和相应
  • 请求: 构成(请求头,空行 ,请求体)
    请求头 :请求方式 请求地址 http协议 (GET/index.html HTTP/1.1)
    换行符 :\r\n
    GET请求的格式 :
    GET /path HTTP/1.1
    Header1: Value1
    Header2: Value2

    每个Header一行一个 ,换行符 是 \r\n

    POST请求的格式:
    POST /path HTTP/1.1
    Header1: Value1
    Header2: Value2

    body date goes here…
    当遇到连续两个\r\n时 ,Header部分结束,后面的数据全部是body

  • 响应:构成(响应头 空行 响应体)

    HTTP/1.1 200 OK\r\n
    \r\n
    body

  1. 使用python socket构建静态服务器(server)与客户端(Client)通信。
import socket
import redef handle_client(client_socket):"为一个客户端进行服务"recv_data = client_socket.recv(1024).decode('utf-8', errors="ignore")request_header_lines = recv_data.splitlines()for line in request_header_lines:print(line)http_request_line = request_header_lines[0]get_file_name = re.match("[^/]+(/[^ ]*)", http_request_line).group(1)print("file name is ===>%s" % get_file_name)  # for test# 如果没有指定访问哪个页面。例如index.html# GET / HTTP/1.1if get_file_name == "/":get_file_name = DOCUMENTS_ROOT + "/index.html"else:get_file_name = DOCUMENTS_ROOT + get_file_nameprint("file name is ===2>%s" % get_file_name) #for testtry:f = open(get_file_name, "rb")except IOError:# 404表示没有这个页面response_headers = "HTTP/1.1 404 not found\r\n"response_headers += "\r\n"response_body = "====sorry ,file not found===="else:response_headers = "HTTP/1.1 200 OK\r\n"response_headers += "\r\n"response_body = f.read()f.close()finally:# 因为头信息在组织的时候,是按照字符串组织的,不能与以二进制打开文件读取的数据合并,因此分开发送# 先发送response的头信息client_socket.send(response_headers.encode('utf-8'))# 再发送bodyclient_socket.send(response_body)client_socket.close()def main():"作为程序的主控制入口"server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)server_socket.bind(("", 7788))server_socket.listen(128)while True:client_socket, clien_cAddr = server_socket.accept()handle_client(client_socket)#这里配置服务器
DOCUMENTS_ROOT = "./html"if __name__ == "__main__":main()demo02  http服务器 多进程(并发)
import socket
import re
import multiprocessingclass WSGIServer(object):def __init__(self, server_address):# 创建一个tcp套接字self.listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 允许立即使用上次绑定的portself.listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定self.listen_socket.bind(server_address)# 变为被动,并制定队列的长度self.listen_socket.listen(128)def serve_forever(self):"循环运行web服务器,等待客户端的链接并为客户端服务"while True:# 等待新客户端到来client_socket, client_address = self.listen_socket.accept()print(client_address)  # for testnew_process = multiprocessing.Process(target=self.handleRequest, args=(client_socket,))new_process.start()# 因为子进程已经复制了父进程的套接字等资源,所以父进程调用close不会将他们对应的这个链接关闭的client_socket.close()def handleRequest(self, client_socket):"用一个新的进程,为一个客户端进行服务"recv_data = client_socket.recv(1024).decode('utf-8')print(recv_data)requestHeaderLines = recv_data.splitlines()for line in requestHeaderLines:print(line)request_line = requestHeaderLines[0]get_file_name = re.match("[^/]+(/[^ ]*)", request_line).group(1)print("file name is ===>%s" % get_file_name) # for testif get_file_name == "/":get_file_name = DOCUMENTS_ROOT + "/index.html"else:get_file_name = DOCUMENTS_ROOT + get_file_nameprint("file name is ===2>%s" % get_file_name) # for testtry:f = open(get_file_name, "rb")except IOError:response_header = "HTTP/1.1 404 not found\r\n"response_header += "\r\n"response_body = "====sorry ,file not found===="else:response_header = "HTTP/1.1 200 OK\r\n"response_header += "\r\n"response_body = f.read()f.close()finally:client_socket.send(response_header.encode('utf-8'))client_socket.send(response_body)client_socket.close()# 设定服务器的端口
SERVER_ADDR = (HOST, PORT) = "", 8888
# 设置服务器服务静态资源时的路径
DOCUMENTS_ROOT = "./html"def main():httpd = WSGIServer(SERVER_ADDR)print("web Server: Serving HTTP on port %d ...\n" % PORT)httpd.serve_forever()if __name__ == "__main__":main()

HTTP协议(B/S架构下的请求与响应)相关推荐

  1. Jmeter TCP 取样器 上一个请求响应结果参数传个下一个请求,响应结果为空

    出现的问题,上一个请求成功,但是下一个请求返回参数是200 ,但是响应结果为空,如图.原因是因为我没有勾选close connection 每个请求结束后关闭连接. 先来了解一下TCP 取样器界面的的 ...

  2. http协议,http状态码,请求,响应

    http 简介 http 是一种超文本传输协议(Hyper Text Transfer Protocol), 可以用来在络中把服务器消息传输到我们的浏览器中.并且Http 协议是一个基于 TCP/IP ...

  3. 接口测试(http协议,get和post请求和响应)

    TCP/IP四层协议模型    HTTP协议 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网 络协议.是基于TCP/IP模型的应用层协 ...

  4. android http请求缓存,Android Http请求和响应使用协议缓冲区

    我对协议缓冲区主题非常陌生. 但我知道json解析等等 现在,我实际上正在此协议缓冲区上工作,我正在制作一个使用带有协议缓冲区的android进行Http请求和响应的应用程序. 我正在使用androi ...

  5. 文加图, 理解Http请求与响应

    文加图, 理解Http请求与响应 1. http请求和响应步骤 在讲解OkHttp之前, 我们首先来个高清大图, 看下http请求的整个步骤, 有个整体概念. 2. http每一步详细内容 在一次完整 ...

  6. http协议下:为什么请求与响应会做到准确误的对应。不会出现请求与响应的错乱...

    互联网通信是套接字进行通信的,套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程. ...

  7. 设置失败重新发起_微服务架构下请求调用失败了怎么办!

    微服务架构相比单体架构,服务的调用从同一台机器内部的本地调用变成了不同机器之间的远程方法调用,但是这个过程也引入了两个不确定的因素: - 调用的执行是在服务提供者一端,即使服务消费者本身是正常的,服务 ...

  8. RSocket云原生架构下的另一种通信协议选择

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 写在前面 奈飞公司在整个微服务架构体系处于行业领先地位,在其内部有一种自研的通信协议方式,以实现微服务架构下高性能的通信,他 ...

  9. Re:从 0 开始的微服务架构--(四)如何保障微服务架构下的数据一致性--转

    原文地址:http://mp.weixin.qq.com/s/eXvoJew3bjFKzLLJpS0Otg 随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台.就像前边的文章说的, ...

最新文章

  1. 用JDBC写一个学生管理系统(添加、删除、修改、查询学生信息)
  2. ubuntu 对apahce的php 服务器使用
  3. python学习官网-Python学习(一)—— 初识python
  4. (转载)简单linux C++内存池
  5. boost::fusion::make_map用法的测试程序
  6. android glide裁剪图片大小,Glide系列(二)------图片剪裁
  7. 怎样查看.a和so文件中的接口
  8. nodejs redis 过期时间_别在为Redis面试而烦恼了?看完暴答【面试管】
  9. 从零开始学习Docker
  10. 历史文章之机器学习和深度学习
  11. php如何取屏幕大小,JavaScript_JS获取当前网页大小以及屏幕分辨率等,效果如下:代码如下:- phpStudy...
  12. 安全公司-* * * *-面试题:_ 安卓逆向分析分享
  13. java生成图片中文乱码_Java生成图片乱码问题的解决方法
  14. java注解生成xml和包含CDATA问题
  15. 2021最新调查报告来了!揭露中国程序员工作和生活真实现状
  16. Ps的一些小知识,还有快捷键
  17. 全国气象预报业务产品grib2数据格式解析
  18. 侣吵架脱光衣服路人震惊 盘点那些行为出格的情侣(组图
  19. 免费股票数据API接口
  20. 如何把一张图片分割成几张

热门文章

  1. 磁盘测试工具FIO工具安装和使用方法
  2. 【Matlab 六自由度机器人】基于蒙特卡罗方法(Monte Carlo Method)构建机器人工作空间(附MATLAB建模仿真完整代码)
  3. 8个适用于Android和iOS的文件管理APP
  4. ConvNeXt网络详解
  5. No such file or directory及解决方法
  6. Revit连接Access数据库
  7. 京都计算机学院放假时间表,2019全年放假时间表
  8. java实现redis工具类及其调用
  9. 14.【opencv打开视频以及摄像头】
  10. 《奔跑吧Linux内核(第二版)》第三章笔记