HTTP响应
1. http响应的过程
简单的web server代码
# encoding:utf-8 # @Time : 2021/5/23 12:11 下午 # @Author : yan # @Content: 最简单的http server from socket import * def create_server(): server_socket = socket(AF_INET, SOCK_STREAM) try: server_socket.bind(("localhost", 9000)) server_socket.listen(5) while (1): client_socket, address = server_socket.accept() rd = client_socket.recv(5000).decode() piece = rd.split("\n") # GET / HTTP/1.1, GET /favicon.ico HTTP/1.1 if len(piece) > 0: print(piece[0]) data = "HTTP/1.1 200 OK\r\n" # 构造回应报文的回应行 data += "Content-Type:text/html;charset=utf-8\r\n" # 构造回应报文的回应头 data += "\r\n" # 回应头和回应体之间必须有一个空行 data += "<html><body>Hello world</body></html>" # 构造回应报文的回应体 client_socket.sendall(data.encode()) client_socket.shutdown(SHUT_WR) except KeyboardInterrupt: print("\nShutting down ...\n") except Exception as exc: print("Error:\n") print(exc) server_socket.close() if __name__ == '__main__': print("Access Http://localhost:9000") create_server()
请求结果
简单的浏览器客户端代码例子一
import socket my_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) my_sock.connect(("127.0.0.1",9000)) cmd = "GET http://127.0.0.1/remeo.txt HTTP/1.0\r\n\r\n".encode() my_sock.send(cmd) while True: data = my_sock.recv(521) if len(data) < 1: break print(data.decode(), end="") # 服务器返回的消息 # HTTP/1.1 200 OK # Content-Type:text/html;charset=utf-8 # # <html><body>Hello world</body></html> my_sock.close()
简单的浏览器客户端代码例子二
import urllib.request # 这里urlib对socket进行了封装,解析的过程已经做了,只返回了响应体的内容 fhand = urllib.request.urlopen("http://127.0.0.1:9000/remeo.txt") # 这里只能拿回响应体内容 for line in fhand: # <html><body>Hello world</body></html> print(line.decode().strip())
# TODO