http中长连接与短连接的区别,和实现方式。
http中长连接与短连接的区别,和实现方式。
一.短连接:在每次获取数据时,客户端都会与服务器进行三次握手建立连接,接受完数据以后再四次挥手断开连接。即每次客户端获取数据,服务器都会指派一个新的socket套接字来为客户端服务。
二.长连接:在客户端与服务器三次握手建立连接以后,客户端的每次接受数据都建立在这一个连接上,也即客户端每次获取数据对服务器而言都是用同一个套接字为其服务的。直到客户端获取结束以后再四次挥手断开连接。
三.长连接与短连接的区别
1.短链接http协议为http1.0,长连接的http协议为1.1
2.短连接由于是每次用新套接字来服务客户端,所以每次发送完数据以后都是由服务器关闭套接字,即服务器先开始四次挥手,以此来告知客户端,数据已经发送完毕。
因此实现短连接的套接字很简单,header中只需要有如下,并且发送完数据以后关闭套接字即可。
# header部分
response = "HTTP/1.1 200 ok\r\n"
response += "\r\n"
# body部分
response += "hello world"
socket.send(response.encode("utf-8"))
socket.close()
而长连接则是由客户端先关闭套接字,即客户端先开始四次挥手,以此来告知服务器,不再获取数据。那么就面临一个问题,客户端如何确认服务器发送过来的数据已经发送完成?
解决的办法是在header段中添加content-Length 字段 而这个字段的值则是body内容的长度
# 将要发送的数据读出
body_content = f.read()
# 返回内容
# 返回header
response_header = "HTTP/1.1 200 ok\r\n"
response_header += f"content-Length:{len(body_content).encode('utf-8')}\r\n"
# 换行
response_header += "\r\n"
# 发送给客户端
new_socket.send(response_header.encode("utf-8") + body_content)
外面可以设置if 循环,只要套接字能接受到数据则使用这个段代码为客户端服务发送数据,若套接字接收到的数据为空,则证明客户端主动关闭发起了四次挥手,则服务器可以执行socket.close()。
四.
为什么不使用短连接而使用长连接?
1.由于现在网站页面上会存在很多数据,比如图片之类的,如果每次加载一个页面中有几十个图片,用短连接则需要建立几十次连接,长连接只需要建立一次连接发送多次请求,相较而言长连接会更快的返回数据。
2.短连接加载一个页面需要服务器为其不停的创建几十个套接字为其服务,而长连接只需要一个,因此可以节约出很多资源。