Python网络编程—TCP套接字之HTTP传输

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

1.用途 : 网页获取,数据的传输

2.特点:

  • 应用层协议,传输层使用tcp传输
  • 简单,灵活,很多语言都有HTTP专门接口
  • 无状态,协议不记录传输内容
  • http1.1 支持持久连接,丰富了请求类型

3.网页请求过程

  1. 客户端(浏览器)通过tcp传输,发送http请求给服务端
  2. 服务端接收到http请求后进行解析
  3. 服务端处理请求内容,组织响应内容
  4. 服务端将响应内容以http响应格式发送给浏览器
  5. 浏览器接收到响应内容,解析展示

HTTP请求(request)

1.请求行 : 具体的请求类别和请求内容

  • GET / HTTP/1.1
  • 请求类别 请求内容 协议版本

请求类别:每个请求类别表示要做不同的事情

  • GET : 获取网络资源
  • POST :提交一定的信息,得到反馈
  • HEAD : 只获取网络资源的响应头
  • PUT : 更新服务器资源
  • DELETE : 删除服务器资源
  • CONNECT
  • TRACE : 测试
  • OPTIONS : 获取服务器性能信息

2.请求头:对请求的进一步解释和描述

  • Accept-Encoding: gzip

3.空行

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

 1 from socket import *
 2
 3 s = socket()
 4 s.bind((‘0.0.0.0‘,8001))
 5 s.listen(3)
 6 c,addr = s.accept()
 7 print("Connect from",addr)
 8 data = c.recv(4096)
 9 print(data)
10
11 data = """HTTP/1.1 200 OK
12 Content-Type:text/html
13
14 <h1>Hello world</h1>
15 """
16 c.send(data.encode())
17
18 c.close()
19 s.close()

http 请求响应示例

http响应(response)

响应格式:响应行,响应头,空行,响应体

响应行 : 反馈基本的响应情况

  • HTTP/1.1 200 OK
  • 版本信息 响应码 附加信息

响应码 :

  • 1xx 提示信息,表示请求被接收
  • 2xx 响应成功
  • 3xx 响应需要进一步操作,重定向
  • 4xx 客户端错误
  • 5xx 服务器错误

响应头:对响应内容的描述

  • Content-Type: text/html

响应体:响应的主体内容信息

 1 from socket import *
 2
 3 # 处理客户端请求
 4 def handle(connfd):
 5   request = connfd.recv(4096) # 接收请求
 6   # 防止客户端断开request为空
 7   if not request:
 8     return
 9   request_line = request.splitlines()[0]
10   info = request_line.decode().split(‘ ‘)[1]
11   if info == ‘/‘:
12     with open(‘index.html‘) as f:
13       response = "HTTP/1.1 200 OK\r\n"
14       response += "Content-Type:text/html\r\n"
15       response += ‘\r\n‘
16       response += f.read()
17   else:
18     response = "HTTP/1.1 404 Not Found\r\n"
19     response += "Content-Type:text/html\r\n"
20     response += ‘\r\n‘
21     response += "<h1>Sorry...</h1>"
22   # 发送给浏览器
23   connfd.send(response.encode())
24
25
26 # 搭建tcp网络
27 sockfd = socket()
28 sockfd.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
29 sockfd.bind((‘0.0.0.0‘,8000))
30 sockfd.listen(3)
31 while True:
32   connfd,addr = sockfd.accept()
33   handle(connfd)  # 处理客户端请求

http 发送网页给浏览器

原文地址:https://www.cnblogs.com/maplethefox/p/10989040.html

时间: 2024-08-01 17:02:07

Python网络编程—TCP套接字之HTTP传输的相关文章

[python] 网络编程之套接字Socket、TCP和UDP通信实例

很早以前研究过C#和C++的网络通信,参考我的文章: C#网络编程之Tcp实现客户端和服务器聊天 C#网络编程之套接字编程基础知识 C#网络编程之使用Socket类Send.Receive方法的同步通讯 Python网络编程也类似.同时最近找工作笔试面试考察Socket套接字.TCP\UDP区别比较多,所以这篇文章主要精简了<Python核心编程(第二版)>第16章内容.内容包括:服务器和客户端架构.套接字Socket.TCP\UDP通信实例和常见笔试考题. 最后希望文章对你有所帮助,如果有不

Python网络编程—socket套接字编程(TCP)

套接字介绍 1.套接字 : 实现网络编程进行数据传输的一种技术手段 2.Python实现套接字编程:import socket 3.套接字分类 流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案.(面向连接--tcp协议--可靠的--流式套接字) 数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案.(无连接--udp协议--不可靠--数据报套接字) tcp套接字 服务端流程 1.创建套接字 sockfd=socket.socket

Python网络编程——修改套接字发送和接收的缓冲区大小

很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 1 # ! /usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 import socket 5 6 # 设置发送缓冲域大小 7 SEND_BUF_SIZE = 4096 8 # 设置接收缓冲域大小 9 RECV_BUF_SIZE = 4096 10 11 12 def modify_buff_size(): 13 # 创建TCP soc

Python网络编程—socket套接字编程(UDP)

套接字介绍 1.套接字 : 实现网络编程进行数据传输的一种技术手段 2.Python实现套接字编程:import socket 3.套接字分类 流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案.(面向连接--tcp协议--可靠的--流式套接字) 数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案.(无连接--udp协议--不可靠--数据报套接字) UDP套接字编程 服务端流程 1.创建数据报套接字 sockfd = socket

Python网络编程——处理套接字错误

在网络应用中,经常会遇到这种情况:一方尝试连接,但另一方由于网络媒介失效或者其他原因无法响应. Python的Socket库提供了一个方法,能通过socket.error异常优雅地处理套接字错误. 1. 代码及相关解释 1 # ! /usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # 处理套接字错误 4 5 import argparse 6 # python用于解析命令行参数和选项的标准模块 7 import sys 8 import socket

Python网络编程—UDP套接字广播

广播定义 : 一端发送多点接收 广播地址 : 每个网络的最大地址为发送广播的地址,向该地址发送,则网段内所有主机都能接收. """ 创建udp套接字 设置套接字可以接收广播 选择接收端口 """ from socket import * s=socket(AF_INET,SOCK_DGRAM) #让套接字接收广播 s.setsockopt(SOL_SOCKET,SO_BROADCAST,1) s.bind(("0.0.0.0"

TCP/IP网络编程之套接字类型与协议设置

套接字与协议 如果相隔很远的两人要进行通话,必须先决定对话方式.如果一方使用电话,另一方也必须使用电话,而不是书信.可以说,电话就是两人对话的协议.协议是对话中使用的通信规则,扩展到计算机领域可整理为"计算机间对话必备通信规则" 在TCP/IP网络编程之网络编程和套接字这一章中,我们已经介绍了如何创建套接字,但为了完全理解该函数,此处将继续展开讨论 #include <sys/socket.h> int socket(int domain, int type, int pr

Linux网络编程——原始套接字实例:简单版网络数据分析器

通过<Linux网络编程--原始套接字编程>得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 链路层封包格式 MAC 头部(有线局域网) 注意:CRC.PAD 在组包时可以忽略 链路层数据包的其中一种情况: unsigned char msg[1024] = { //--------------组MAC--------14------ 0xb8, 0x88, 0xe3, 0xe1, 0x10, 0xe6, // dst

Linux网络编程——原始套接字实例:MAC 头部报文分析

通过<Linux网络编程——原始套接字编程>得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 链路层封包格式 MAC 头部(有线局域网) 注意:CRC.PAD 在组包时可以忽略 链路层数据包的其中一种情况: 1 unsigned char msg[1024] = { 2 //--------------组MAC--------14------ 3 0xb8, 0x88, 0xe3, 0xe1, 0x10, 0xe6,