博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python Http的Socket编程
阅读量:4221 次
发布时间:2019-05-26

本文共 4635 字,大约阅读时间需要 15 分钟。

Socket之静态http服务器编程

  1. 创建socket套接字
  2. 绑定端口号
  3. 设置监听
  4. 等待客户端连接请求
  5. 封装http响应报文格式
  6. 使用客户端的套接字回复消息
  7. 关闭客户端连接
import socketif __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\nHost: localhost:8001\r\n  Connection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-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\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\nCookie: pgv_pvi=1246921728; \r\n\r\n  (请求头信息后面还有一个单独的’\r\n’不能省略)
  • 请求行
    GET / HTTP/1.1 \r\n
    分别代表:请求方式、资源路径、http协议版本
  • 请求头
    每一行都是一个键值对+\r\n组成
说明
Host localhost:8001 服务器的主机地址和端口号,默认是80
Connection keep-alive 和服务端保持长连接
Upgrade-Insecure-Requests 1 让浏览器升级不安全请求,使用https请求
User-Agent Mozilla/5.0… 用户代理,也就是客户端的名称
Accept text/html, application/xhtml+xml,application/xml;… 可接受的数据类型
Accept-Encoding gzip, deflate 可接受的压缩格式
Accept-Language zh-CN,zh;q=0.9 可接受的语言,q代表权值
Cookie pgv_pvi=1246921728; 登录用户的身份标识
  • 空行
    最后要有一个空行\r\n

4、post请求报文

组成:

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

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

POST /adduser HTTP/1.1\r\nHost: localhost:8001\r\nConnection: keep-alive\r\nContent-Type: application/x-www-form-urlencoded\r\nUser-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 Datausername=hello&pass=hello
  • 请求行
    POST /adduser HTTP/1.1\r\n
    分别代表:请求方式、资源路径、http协议版本
  • 请求头
    每一行都是一个键值对+\r\n组成,其它参数同get请求
说明
Content-Type application/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\nContent-Type: text/html; charset=UTF-8\r\nTransfer-Encoding: chunked\r\nConnection: keep-alive\r\nDate: Sun, 28 Jun 2020 09:01:10 GMT\r\n---空行----\r\n(响应头信息后面还有一个单独的’\r\n’不能省略)---响应体---- …
  • 响应行
    HTTP/1.1 200 OK\r\n
    分别代表:HTTP协议版本、状态码、状态描述
  • 响应头
    每一行都是一个键值对+\r\n组成
说明
Server apache 服务器名称
Content-Type text/html; charset=UTF-8 内容类型
Transfer-Encoding chunked 发送结束的标记是0\r\n, Content-Length表示服务端确定发送给客户端的内容大小,但是二者只能用其一。
Connection keep-alive 和客户端保持长连接
Date Sun, 28 Jun 2020 09:01:10 GMT 服务端的响应时间
  • 空行

    与请求体之间要有一个空行\r\n

  • 响应体

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

三种报文对比

在这里插入图片描述

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

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 服务器内部源代码出现错误

转载地址:http://hbqmi.baihongyu.com/

你可能感兴趣的文章
扩大工作室?
查看>>
拜读ms的开源代码
查看>>
下一个技术瓶颈 ~~
查看>>
谢谢让我看到了这本书
查看>>
不牵手的浪漫
查看>>
姥姥的生日~~
查看>>
网游~~
查看>>
promise
查看>>
对过楼着火了~
查看>>
list
查看>>
放松了一个晚上,继续~~
查看>>
好久没来了~
查看>>
真tmd恶心~~
查看>>
fight for java
查看>>
小猪考试中~
查看>>
理解,promise~~
查看>>
微软之行
查看>>
Application OR Research
查看>>
唉,这个时候还算好吧
查看>>
有趣的考试~~
查看>>