一、简单的web服务器实现
1、返回固定页面的http服务器
import socket
def service_client(new_socket):
"""为这个客户端返回数据"""
# 1、接收客户端发送过来的请求,即http请求
# GET/HTTP/1.1
# ......
request=new_socket.recv(1024)
print(request)
# 2、返回http格式的数据,给浏览器
# 2.1、准备发送给客户端的数据----header
response="HTTP/1.1 200 OK\r\n"
response+="\r\n"
# 2.2、准备发送给客户端的数据----body
response+="hahhahahhaha"
new_socket.send(response.encode("gbk"))
# 关闭套接字
new_socket.close()
def main():
"""用来完成整体的控制"""
# 1、创建套接字
tcp_server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2、绑定
tcp_server_socket.bind(("",7890))
# 3、变为监听套接字
tcp_server_socket.listen(128)
while True:
# 4、等待新客户端的链接
new_socket,client_addr=tcp_server_socket.accept()
# 5、为这个客户端服务
service_client(new_socket)
# 关闭监听套接字
tcp_server_socket.close()
if __name__=="__main__":
main()
浏览器中效果:
2、并发:
(1)单进程单线程实现监听多个套接字
import socket
import time
tcp_server_tcp=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_server_tcp.bind(("",7890))
tcp_server_tcp.listen(128)
tcp_server_tcp.setblocking(False) # 设置套接字为非堵塞方式
client_socket_list=list()
while True:
try:
new_socket,new_addr=tcp_server_tcp.accept()
except Exception as ret:
print("--------没有新的客户端到来--------")
else:
print("------------没有产生异常,意味着来了一个新的客户端-----------")
new_socket.setblocking(False) # 设置套接字为非堵塞方式
client_socket_list.append(new_socket)
for client_socket in client_socket_list:
try:
recv_data=client_socket.recv(1024)
except Exception as ret:
print("-----------这个客户端没有发送过来数据----------")
else:
if recv_data: # 对方发送过来数据
print("------------客户端发送过来了数据-------------")
else: # 对方调用close,导致了recv返回
client_socket_list.remove(client_socket)
client_socket.close()
print("----客户端已经关闭-----")
time.sleep(1)
3、长连接和短连接
- 使用长连接的 HTTP 协议,会在响应头加入这行代码:
Connection:keep-alive
- HTTP1.0默认使用短连接,HTTP1.0默认使用长连接