官网网站搭建需要多少钱,设计网站的基本步骤,友情链接网站大全,哪些网站可以做一些任务挣钱补充#xff1a;tcp长连接和短连接长连接#xff1a;客户端向服务器发起连接请求#xff0c;服务器接收到请求回应给客户端#xff0c;双方完成三次握手#xff0c;然后客户端发送消息#xff0c;服务端回应消息#xff0c;每一次完成读写操作#xff0c;套接字不不关闭…补充tcp长连接和短连接长连接客户端向服务器发起连接请求服务器接收到请求回应给客户端双方完成三次握手然后客户端发送消息服务端回应消息每一次完成读写操作套接字不不关闭也就是连接不关闭继续保持连接等待下一次的读写操作长时间之后客户端发起关闭请求。短连接短连接则是一般只会在 client/server 间传递一次读写操作一次读写操作之后就关闭连接下一次的操通信则又从三次握手开始重新建立连接。简单的http服务器__author__ Administratorimportsocketdefservice_client(new_socket):#1.接收浏览器发送过来的请求即http请求requestnew_socket.recv(1024)#2.返回浏览器http格式的数据#2.1准备发送给浏览器的数据——header#\r\n给Windows使用responseHTTP/1.1 200 OK\r\nresponse\r\n#2.2准备发送给浏览器的数据——bodyresponse哈哈哈哈哈new_socket.send(response.encode(utf-8))#3.关闭套接字new_socket.close()defmain():#1.创建套接字tcp_serversocket.socket(socket.AF_INET,socket.SOCK_STREAM)#2.绑定tcp_server.bind((,8081))#3.监听套接字tcp_server.listen(128)#4.等待新客户端的链接whileTrue:new_socket,client_addrtcp_server.accept()#5.为这个客户端服务service_client(new_socket)#6.关闭监听套接字tcp_server.close()if __name__ __main__:main()View Code返回给浏览器相应的页面Python splitlines() 按照行(\r, \r\n, \n)分隔返回一个包含各行作为元素的列表如果参数 keepends 为 False不包含换行符如果为 True则保留换行符。str.splitlines([keepends])keepends -- 在输出结果里是否保留换行符(\r, \r\n, \n)默认为 False不包含换行符如果为 True则保留换行符。__author__ Administratorimportsocketdefservice_client(new_socket):#1.接收浏览器发送过来的请求即http请求requestnew_socket.recv(1024)print(*100)print(request)#2.返回浏览器http格式的数据#2.1准备发送给浏览器的数据——header#\r\n给Windows使用responseHTTP/1.1 200 OK\r\nresponse\r\n#2.2准备发送给浏览器的数据——bodyfopen(./html/index.html,rb)html_contentf.read()f.close()#将response header发送给浏览器new_socket.send(response.encode(utf-8))#将response body发送给浏览器new_socket.send(html_content)#3.关闭套接字new_socket.close()defmain():#1.创建套接字tcp_serversocket.socket(socket.AF_INET,socket.SOCK_STREAM)#2.绑定tcp_server.bind((,8081))#3.监听套接字tcp_server.listen(128)#4.等待新客户端的链接whileTrue:new_socket,client_addrtcp_server.accept()#5.为这个客户端服务service_client(new_socket)#6.关闭监听套接字tcp_server.close()if __name__ __main__:main()View Code根据用户需求返回相应的页面(对页面进行操作之后返回的页面)__author__ Administratorimportsocketimportredefservice_client(new_socket):#1.接收浏览器发送过来的请求即http请求requestnew_socket.recv(1024).decode(utf-8)#print(*100)#print(request)request_lines request.splitlines()print()print(*20)print(request_lines)#GET /index.html HTTP/1.1file_nameresre.match(r[^/](/[^ ]*),request_lines[0])ifres:file_nameres.group(1)if file_name/:file_name/index.html#2.返回浏览器http格式的数据#\r\n给Windows使用try:#忘了复习一下#try中是尝试执行的代码#except 中是对错误进行处理#else中是没有异常才会执行的代码fopen(./htmlfile_name,rb)except:responseHTTP/1.1 404 NOT FOUND\r\nresponse\r\nresponse————file not found————new_socket.send(response.encode(utf-8))else:html_contentf.read()f.close()responseHTTP/1.1 200 OK\r\nresponse\r\n#将response header发送给浏览器new_socket.send(response.encode(utf-8))#将response body发送给浏览器new_socket.send(html_content)#3.关闭套接字new_socket.close()defmain():#1.创建套接字tcp_serversocket.socket(socket.AF_INET,socket.SOCK_STREAM)#2.绑定tcp_server.bind((,8081))#3.监听套接字tcp_server.listen(128)#4.等待新客户端的链接whileTrue:new_socket,client_addrtcp_server.accept()#5.为这个客户端服务service_client(new_socket)#6.关闭监听套接字tcp_server.close()if __name__ __main__:main()View Code使用多进程完成http服务器__author__ Administratorimportsocketimportreimportmultiprocessingdefservice_client(new_socket):#1.接收浏览器发送过来的请求即http请求requestnew_socket.recv(1024).decode(utf-8)#print(*100)#print(request)request_lines request.splitlines()print()print(*20)print(request_lines)#GET /index.html HTTP/1.1file_nameresre.match(r[^/](/[^ ]*),request_lines[0])ifres:file_nameres.group(1)if file_name/:file_name/index.html#2.返回浏览器http格式的数据#\r\n给Windows使用try:#忘了复习一下#try中是尝试执行的代码#except 中是对错误进行处理#else中是没有异常才会执行的代码fopen(./htmlfile_name,rb)except:responseHTTP/1.1 404 NOT FOUND\r\nresponse\r\nresponse————file not found————new_socket.send(response.encode(utf-8))else:html_contentf.read()f.close()responseHTTP/1.1 200 OK\r\nresponse\r\n#将response header发送给浏览器new_socket.send(response.encode(utf-8))#将response body发送给浏览器new_socket.send(html_content)#3.关闭套接字new_socket.close()defmain():#1.创建套接字tcp_serversocket.socket(socket.AF_INET,socket.SOCK_STREAM)#2.绑定tcp_server.bind((,8081))#3.监听套接字tcp_server.listen(128)whileTrue:#4.等待新客户端的链接[这里类似银行的柜台窗口]new_socket,client_addrtcp_server.accept()#5.为这个客户端服务pmultiprocessing.Process(targetservice_client,args(new_socket,))p.start()#在主进程创建子进程之后子进程会复制主进程的所有资源所有就会有两个相同的new_socket套接字#在service_client()中是子进程关闭了套接字那在主进程中也是需要关闭该套接字new_socket.close()#6.关闭监听套接字tcp_server.close()if __name__ __main__:main()View Code使用多线程完成http服务器__author__ Administratorimportsocketimportreimportthreadingdefservice_client(new_socket):#1.接收浏览器发送过来的请求即http请求requestnew_socket.recv(1024).decode(utf-8)#print(*100)#print(request)request_lines request.splitlines()print()print(*20)print(request_lines)#GET /index.html HTTP/1.1file_nameresre.match(r[^/](/[^ ]*),request_lines[0])ifres:file_nameres.group(1)if file_name/:file_name/index.html#2.返回浏览器http格式的数据#\r\n给Windows使用try:#忘了复习一下#try中是尝试执行的代码#except 中是对错误进行处理#else中是没有异常才会执行的代码fopen(./htmlfile_name,rb)except:responseHTTP/1.1 404 NOT FOUND\r\nresponse\r\nresponse————file not found————new_socket.send(response.encode(utf-8))else:html_contentf.read()f.close()responseHTTP/1.1 200 OK\r\nresponse\r\n#将response header发送给浏览器new_socket.send(response.encode(utf-8))#将response body发送给浏览器new_socket.send(html_content)#3.关闭套接字new_socket.close()defmain():#1.创建套接字tcp_serversocket.socket(socket.AF_INET,socket.SOCK_STREAM)#2.绑定tcp_server.bind((,8081))#3.监听套接字tcp_server.listen(128)whileTrue:#4.等待新客户端的链接new_socket,client_addrtcp_server.accept()#5.为这个客户端服务pthreading.Thread(targetservice_client,args(new_socket,))p.start()#注意这里和进程的区别多线程之间共享变量子线程没有复制主线程#new_socket.close()#6.关闭监听套接字tcp_server.close()if __name__ __main__:main()View Code使用gevent(协程)完成http服务器__author__ Administratorimportsocketimportreimportgeventfrom gevent importmonkeymonkey.patch_all()defservice_client(new_socket):#1.接收浏览器发送过来的请求即http请求requestnew_socket.recv(1024).decode(utf-8)#print(*100)#print(request)request_lines request.splitlines()print()print(*20)print(request_lines)#GET /index.html HTTP/1.1file_nameresre.match(r[^/](/[^ ]*),request_lines[0])ifres:file_nameres.group(1)if file_name/:file_name/index.html#2.返回浏览器http格式的数据#\r\n给Windows使用try:#忘了复习一下#try中是尝试执行的代码#except 中是对错误进行处理#else中是没有异常才会执行的代码fopen(./htmlfile_name,rb)except:responseHTTP/1.1 404 NOT FOUND\r\nresponse\r\nresponse————file not found————new_socket.send(response.encode(utf-8))else:html_contentf.read()f.close()responseHTTP/1.1 200 OK\r\nresponse\r\n#将response header发送给浏览器new_socket.send(response.encode(utf-8))#将response body发送给浏览器new_socket.send(html_content)#3.关闭套接字new_socket.close()defmain():#1.创建套接字tcp_serversocket.socket(socket.AF_INET,socket.SOCK_STREAM)#2.绑定tcp_server.bind((,8081))#3.监听套接字tcp_server.listen(128)whileTrue:#4.等待新客户端的链接new_socket,client_addrtcp_server.accept()#5.为这个客户端服务gevent.spawn(service_client,new_socket)#6.关闭监听套接字tcp_server.close()if __name__ __main__:main()View Code单进程、线程、非堵塞实现并发__author__ Administratorimportsockettcp_socketsocket.socket(socket.AF_INET,socket.SOCK_STREAM)tcp_socket.bind((,8081))tcp_socket.listen(128)#设置套接字为非堵塞方式tcp_socket.setblocking(False)client_listlist()#在没有设置套接字为堵塞的时候accept和recv默认都是堵塞的那客户端没有发送链接或者没有发送数据过来都是不会报异常的#现在设置套接字为非堵塞那么此时accept就是非堵塞的那客户端没有发送链接或者没有发送数据过来都是报异常的whileTrue:try:new_tcp_socket,addrtcp_socket.accept()exceptException as res:print(res)print(————没有新的客户端链接————)else:#设置新的套接字为非堵塞默认堵塞的时候不发数据过来不会异常但是此时非堵塞不发数据过来就会异常new_tcp_socket.setblocking(False)client_list.append(new_tcp_socket)for client_socket inclient_list:try:recv_datanew_tcp_socket.recv(1024)exceptException as res:print(res)print(————客户端没有发送数据过来————)else:print(recv_data)ifrecv_data:print(————客户端发送数据过来————)else:client_list.remove(new_tcp_socket)new_tcp_socket.close()print(————客户端已经关闭了————)View Code单进程、线程、非堵塞、长连接实现http服务器__author__ Administratorimportsocketimportredefservice_client(new_socket,request):#1.接收浏览器发送过来的请求即http请求#requestnew_socket.recv(1024).decode(utf-8)#print(*100)#print(request)request_lines request.splitlines()print()print(*20)print(request_lines)#GET /index.html HTTP/1.1file_nameresre.match(r[^/](/[^ ]*),request_lines[0])ifres:file_nameres.group(1)if file_name/:file_name/index.html#2.返回浏览器http格式的数据#\r\n给Windows使用try:#忘了复习一下#try中是尝试执行的代码#except 中是对错误进行处理#else中是没有异常才会执行的代码fopen(./htmlfile_name,rb)except:responseHTTP/1.1 404 NOT FOUND\r\nresponse\r\nresponse————file not found————new_socket.send(response.encode(utf-8))else:html_contentf.read()f.close()response_bodyhtml_contentresponse_header HTTP/1.1 200 OK\r\nresponse_headerContent-Length:%d\r\n %len(response_body)response_header\r\nresponseresponse_header.encode(utf-8)response_body#将response 发送给浏览器new_socket.send(response)#3.关闭套接字#在这个地方服务器强制关闭了套接字表明了并不是长连接而是短连接#new_socket.close()defmain():#1.创建套接字tcp_serversocket.socket(socket.AF_INET,socket.SOCK_STREAM)#2.绑定tcp_server.bind((,8081))#3.监听套接字tcp_server.listen(128)tcp_server.setblocking(False)#将套接字设置为非堵塞client_listlist()#4.等待新客户端的链接whileTrue:try:new_socket,client_addrtcp_server.accept()exceptException as res:passelse:new_socket.setblocking(False)client_list.append(new_socket)for client_socket inclient_list:try:recv_data client_socket.recv(1024).decode(utf-8)exceptException as res:passelse:ifrecv_data:service_client(client_socket,recv_data)else:client_socket.close()client_list.remove(client_socket)#6.关闭监听套接字tcp_server.close()if __name__ __main__:main()View Codeepoll是Linux内核为处理大批量文件描述符而作了改进的poll是Linux下多路复用IO接口select/poll的增强版本它能显著提高程序在大量并发链接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候它无须遍历整个被侦听的描述符集只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外还提供了边缘触发(Edge Triggered)这就使得用户空间程序有可能缓存IO状态减少epoll_wait/epoll_pwait的调用提高应用程序效率。通信过程浏览器访问服务器的过程在浏览器访问http:www.baidu.com(域名)该电脑先检查是否认识默认网关的MAC地址如果没有以arp广播广播过去该电脑的默认网关地址组织一个域名解析的数据请求发送给网关网关发送到互联网上互联网经过一层一层的转发到达DNS服务器其把域名解析出来之后把ip地址回送给浏览器然后把ip发送给网关网关把数据发送到互联网把数据转发给服务器发送到服务器客户端和浏览器三次握手成功浏览器把请求发送给服务器服务器解析请求返回数据给客户端浏览器显示显示成功之后然后四次挥手结束。