• 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
    "
            response += "
    "
            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
    "
            response_header += "Content-Length:%d
    " % len(response_body)
            response_header += "
    "
    
            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()
  • 相关阅读:
    Javascript之内置对象
    Javascript之匿名函数(私有变量)
    Web前端开发修炼之道 (2)
    11.标志寄存器
    10.CALL和RET指令
    Javascript之继承(其他方式)
    Javascript之Function类型
    5.[BX]和Loop指令
    JavaScript之执行环境及作用域
    Javascript之BOM(window对象)
  • 原文地址:https://www.cnblogs.com/fromlantianwei/p/10027688.html
Copyright © 2020-2023  润新知