zoukankan      html  css  js  c++  java
  • 第十六节 使用协程完成http服务器

    import socket
    import gevent
    from gevent import monkey
    
    monkey.patch_all()
    
    def tcp_serve(resp_socket):
        recv_data = resp_socket.recv(1024)
        # 处于阻塞状态等待客户端给数据,给了以后才会继续进行下一步
        print(recv_data)
        resp_data = 'HTTP/1.1 200 OK
    ' + "
    " +'hahaha'
        # 浏览器识别的换行为
    
        resp_socket.send(resp_data.encode('utf-8'))
        resp_socket.close()
    
    def main():
        """简单web服务器"""    
        # 1、创建套间字
        # 128是指最大运行客户端的链接数
        web_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        web_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # 如果强制服务端先调用close,则再次链接需要转换端口,不然端口会被占用等待客户端的反馈
        web_socket.bind(('192.168.0.106',8080))
        web_socket.listen(128)
        while True:    
            resp_socket, resp_addr = web_socket.accept()
            '''三次握手的成功是服务器开始调用accept,
            当while第一循环时开始发起connect,握手到成功然后服务器开始为其服务,即发送数据,此时如果第二个客户端发起请求,
            第二个客户端就要等待服务器为第一个客户端服务完成才能接受新的链接
            这就造成第二个客户端需要等待
            所以创建多任务,为第一个客户端握手成功后单独服务,可以减少第二个客户端的等待时间,
            所以多任务的作用并不是减少握手的时间,只是减少服务等待时间
            '''
            # tcp_serve(resp_socket)
            gevent.spawn(tcp_serve, resp_socket)
            # resp_socket.close()  
            # 这句话好像在乌班图里才需要,因为乌班图里一切皆文件,多进程拷贝时,多导致有两个resp_socket的文件描述符,window好像不会,有没有都没有影响
        web_socket.close()
    
    
    if __name__ == '__main__':
        main()
  • 相关阅读:
    AS2 tween缓动
    flash 绑定 swc类文件
    jsfl自运行与被调运行
    一键清除fla文件中的TLF文本
    as 2的 Event.REMOVED_FROM_STAGE
    jsfl 添加代码
    jsfl 删除库指定内容
    文件上传待研究
    SpringMVC单文件上传、多文件上传、文件列表显示、文件下载
    shiro配置参考(二)可以和mybatis的配置放在一个文件中(不建议这样,可以拆分开来,注意相关配置即可)
  • 原文地址:https://www.cnblogs.com/kogmaw/p/12602504.html
Copyright © 2011-2022 走看看