python Http的Socket编程

Socket之静态http服务器编程
  1. 创建socket套接字
  2. 绑定端口号
  3. 设置监听
  4. 等待客户端连接请求
  5. 封装http响应报文格式
  6. 使用客户端的套接字回复消息
  7. 关闭客户端连接
import socket

if __name__ == '__main__':
    # 创建tcp服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用, 程序退出端口立即释放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口号
    tcp_server_socket.bind(("", 8001))
    # 设置监听
    tcp_server_socket.listen(128)
    while True:
        # 等待接受客户端的连接请求
        new_socket, ip_port = tcp_server_socket.accept()
        # 代码执行到此,说明连接建立成功
        recv_client_data = new_socket.recv(4096)
        # 对二进制数据进行解码
        recv_client_content = recv_client_data.decode("utf-8")
        print(recv_client_content)

        with open("static/index.html", "rb") as file:
            # 读取文件数据
            file_data = file.read()


        # 响应行
        response_line = "HTTP/1.1 200 OK\r\n"
        # 响应头
        response_header = "Server: Python-server\r\n"

        # 响应体
        response_body = file_data

        # 拼接响应报文
        response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
        # 发送数据
        new_socket.send(response_data)

        # 关闭服务与客户端的套接字
        new_socket.close()



计算机网络基础知识介绍:

计算机网络

HTTP协议介绍

  超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的www文件都必须遵守这个标准。

1、HTTP 协议包括哪些请求?

GET:请求读取由URL所标志的信息。

POST:给服务器添加信息(如注释)。

PUT:在给定的URL下存储一个文档。

DELETE:删除给定的URL所标志的资源。

2、HTTP 中, POST 与 GET 的区别

1)Get是从服务器上获取数据,Post是向服务器传送数据。

2)Get是把参数数据队列加到提交表单的Action属性所指向的URL中,值和表单内各个字段一一对应,在URL中可以看到。

3)Get传送的数据量小,不能大于2KB;Post传送的数据量较大,一般被默认为不受限制。

4)根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。

I. 所谓 安全的 意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。

II. 幂等 的意味着对同一URL的多个请求应该返回同样的结果。

3、get请求报文

组成:

  1. 请求行
  2. 请求头
  3. 空行

原始报文:(每行末尾都有一个 ‘\r\n’)

GET / HTTP/1.1 \r\n

Host: localhost:8001\r\n  
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Cookie: pgv_pvi=1246921728; \r\n

\r\n  (请求头信息后面还有一个单独的’\r\n’不能省略)
  • 请求行
    GET / HTTP/1.1 \r\n
    分别代表:请求方式、资源路径、http协议版本
  • 请求头
    每一行都是一个键值对+\r\n组成
说明
Hostlocalhost:8001服务器的主机地址和端口号,默认是80
Connectionkeep-alive和服务端保持长连接
Upgrade-Insecure-Requests1让浏览器升级不安全请求,使用https请求
User-AgentMozilla/5.0…用户代理,也就是客户端的名称
Accepttext/html, application/xhtml+xml,application/xml;…可接受的数据类型
Accept-Encodinggzip, deflate可接受的压缩格式
Accept-Languagezh-CN,zh;q=0.9可接受的语言,q代表权值
Cookiepgv_pvi=1246921728;登录用户的身份标识
  • 空行
    最后要有一个空行\r\n
4、post请求报文

组成:

  1. 请求行
  2. 请求头
  3. 空行
  4. 请求体

原始报文:(每行末尾都有一个 ‘\r\n’)

POST /adduser HTTP/1.1\r\n
Host: localhost:8001\r\n
Connection: keep-alive\r\n
Content-Type: application/x-www-form-urlencoded\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36\r\n
\r\n(请求头信息后面还有一个单独的’\r\n’不能省略)
// Form Data
username=hello&pass=hello
  • 请求行
    POST /adduser HTTP/1.1\r\n
    分别代表:请求方式、资源路径、http协议版本
  • 请求头
    每一行都是一个键值对+\r\n组成,其它参数同get请求
说明
Content-Typeapplication/x-www-form-urlencoded告诉服务端请求的数据类型
  • 空行
    与请求体之间要有一个空行\r\n

  • 请求体
    表单默认的数据格式: username=hello&pass=hello

5、响应报文

组成:

  1. 响应行
  2. 响应头
  3. 空行
  4. 响应体

原始报文:(每行末尾都有一个 ‘\r\n’)

---响应头----
HTTP/1.1 200 OK\r\n

---响应行----
Server: apache\r\n
Content-Type: text/html; charset=UTF-8\r\n
Transfer-Encoding: chunked\r\n
Connection: keep-alive\r\n
Date: Sun, 28 Jun 2020 09:01:10 GMT\r\n
---空行----
\r\n(响应头信息后面还有一个单独的’\r\n’不能省略)

---响应体----
<!DOCTYPE html><html lang=“en”></html>
  • 响应行
    HTTP/1.1 200 OK\r\n
    分别代表:HTTP协议版本、状态码、状态描述
  • 响应头
    每一行都是一个键值对+\r\n组成
说明
Serverapache服务器名称
Content-Typetext/html; charset=UTF-8内容类型
Transfer-Encodingchunked发送结束的标记是0\r\n, Content-Length表示服务端确定发送给客户端的内容大小,但是二者只能用其一。
Connectionkeep-alive和客户端保持长连接
DateSun, 28 Jun 2020 09:01:10 GMT服务端的响应时间
  • 空行
    与请求体之间要有一个空行\r\n

  • 响应体
    <!DOCTYPE html><html lang=“en”> …</html>响应给客户端的数据

三种报文对比

在这里插入图片描述

其它请求体内容格式详见:

POST请求报文数据格式

6、Connection参数,长、短连接

  我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后续请求时,Keep-Alive功能避免了建立或者重新建立连接。

在这里插入图片描述

  如上图中,左边的是关闭Keep-Alive的情况,每次请求都需要建立连接,然后关闭连接;右边的则是Keep-Alive,在第一次建立请求之后保持连接,然后后续的就不需要每次都建立、关闭连接了, 启用Keep-Alive模式肯定更高效,性能更高,因为避免了建立/释放连接的开销 。

  http 1.0中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入"Connection: close ",才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。

7、常见http状态码

HTTP 状态码是用于表示web服务器响应状态的3位数字代码。

状态码说明
200请求成功
307重定向
400错误的请求,请求地址或者参数有误
404请求资源在服务器不存在
500服务器内部源代码出现错误

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值