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()