18 11 27 长连接 短链接
---恢复内容开始---
http 协议有着 1.0 和1.1 在安卓爆发前都是用着 1,0 的协议
短链接 : 如 在一个网页中 先三次握手 拿到了主要数据 马上四次挥手 分析数据后 再进行三次握手 下载改页面所需要的图片
长连接 : 直接进行 三次握手 后拿完所有的资源 之后进行 四次挥手
由于 安卓爆发 许多网站都有了大量的 图片 所以基本都用了长连接
下面是一个单线程 不堵塞 长连接
import socket import re def service_client(new_socket, request): """为这个客户端返回数据""" # 1. 接收浏览器发送过来的请求 ,即http请求 # GET / HTTP/1.1 # ..... # request = new_socket.recv(1024).decode("utf-8") # print(">>>"*50) # print(request) request_lines = request.splitlines() print("") print(">"*20) print(request_lines) # GET /index.html HTTP/1.1 # get post put del file_name = "" ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0]) if ret: file_name = ret.group(1) # print("*"*50, file_name) if file_name == "/": file_name = "/index.html" # 2. 返回http格式的数据,给浏览器 try: f = open("./html" + file_name, "rb") except: response = "HTTP/1.1 404 NOT FOUND\r\n" response += "\r\n" response += "------file not found-----" new_socket.send(response.encode("utf-8")) else: html_content = f.read() f.close() response_body = html_content response_header = "HTTP/1.1 200 OK\r\n" response_header += "Content-Length:%d\r\n" % len(response_body) response_header += "\r\n" response = response_header.encode("utf-8") + response_body new_socket.send(response) def main(): """用来完成整体的控制""" # 1. 创建套接字 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 2. 绑定 tcp_server_socket.bind(("", 7890)) # 3. 变为监听套接字 tcp_server_socket.listen(128) tcp_server_socket.setblocking(False) # 将套接字变为非堵塞 client_socket_list = list() while True: # 4. 等待新客户端的链接 try: new_socket, client_addr = tcp_server_socket.accept() except Exception as ret: pass else: new_socket.setblocking(False) client_socket_list.append(new_socket) for client_socket in client_socket_list: try: recv_data = client_socket.recv(1024).decode("utf-8") except Exception as ret: pass else: if recv_data: service_client(client_socket, recv_data) else: client_socket.close() client_socket_list.remove(client_socket) # 关闭监听套接字 tcp_server_socket.close() if __name__ == "__main__": main()