第十六节 使用协程完成http服务器

Posted kog_maw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十六节 使用协程完成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()

 

以上是关于第十六节 使用协程完成http服务器的主要内容,如果未能解决你的问题,请参考以下文章

第十六节——spring练习之页面上角色列表的展示

学习笔记第十六节课

Android测试第十六节Instrumentation——初识

学习Linux第十六节课 配置域名解析

第十六节20181214

第十六节 URL映射的时候指定默认参数