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. Matplotlib pyplot中title() xlabel() ylabel()无法显示中文(即显示方框乱码)的解决办法...
  2. “京东小贷” 注册资本由30亿元增至50亿元,恭喜
  3. 采用opencv_cascadetrain进行训练的步骤及注意事项
  4. 分布式存储系统设计(2)—— 数据分片
  5. Follow Me:CCIE RS--使用小凡模拟器搭建的CCIE拓扑图
  6. Redis基础(五)——删除策略和内存淘汰机制
  7. 云计算的安全顾虑中不透明性影响云落地
  8. 计算机安装网络设置,网络上安装了Windows操作系统的计算机,可..._网络编辑_帮考网...
  9. [置顶]【留言板 Message Board】
  10. html 多余的字省略号,html中把多余文字转化为省略号
  11. 怎么让maillog日志记录smtp是使用25端口还是465端口(SSL加密方式)
  12. 红包大战不再是两马战,内容平台为何成为新生力量?
  13. 怎么理解anchor?
  14. scrapy模拟点击
  15. 【智能物流】200亿规模的制造企业,如何规划供应链物流体系?
  16. python中“_“用法
  17. 使用 ChatGPT 启发游戏创意|基于 AI 5 天创建一个农场游戏,第 2 天
  18. 服务器所属文件变成nobody,NFS(expirtfs命令,NFS客户端创建新文件所属组和所属主都为nobody)(示例代码)...
  19. Laravel学习笔记 ViewComposer
  20. java 时间戳间隔_JAVA判断两个时间戳,相隔多少分钟

热门文章

  1. android仿腾讯文件管理器,全能文件管理器 – 腾讯文件管理APP
  2. 区块链技术 英文(BlockChain Terminal)简称BCT ——区块链终端
  3. 编程之法—实现单词翻转
  4. 绿盟SecXOps安全智能分析技术
  5. 《告别失控》读书笔记
  6. mysql 中set函数的用法
  7. Ubuntu18.04 LTS安装、配置、美化、常用软件安装、问题总结和使用体验
  8. nat123端口映射linux,nat123 linux版下载
  9. Shell脚本撰写指南
  10. android 线性布局竖线,3.2.1 线性布局(1)