软件开发|编程技术|编程代码|编程入门先学什么—程序设计语言

html5 http的轮询和Websocket原理

收集整理的这篇文章主要介绍了html5 http的轮询和Websocket原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。
一、HTTP的轮询Web客户端与服务器之间基于Ajax(http)的常用通信方式,分为 短连接 与 长轮询 。短连接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。长轮询:客户端像传统轮询一样从服务器请求数据。然而,如果服务器没有可以立即返回给客户端的数据,则不会立刻返回一个空结果,而是保持这个请求等待数据到来(或者恰当的超时:小于ajax的超时时间),之后将数据作为结果返回给客户端。长轮询机制如下图所示:二、Websocket基本概念WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。当你获取 Web Socket 连接后,你可以通过 send() 方法来向服务器发送数据,并通过 onmessage 事件来接收服务器返回的数据。三、Websocket 握手原理:Websocket的握手原理大致可分为以下步骤: 第一步:客户端发起HTTP请求连接 第二步:服务端从请求头中取出Sec-WebSocket-Key的值 第三步:给Sec-WebSocket-Key值 拼接一个magic_string 的到一个新的value 第四步:给新的value先做 sha1加密 再做 base64加密 第五步:拼接一个响应头 第六步:服务器将拼好的响应头发送给客户端 第七步:客户端解密Sec-WebSocket-Accept得到Sec-WebSocket-Key判断是否握手成功代码实现:import socket,base64,hashlib# 创建socket连接sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 绑定端地址和口号sock.bind(('127.0.0.1',9527))# 监听sock.listen(5)# 获取客户端socket对象conn,address = sock.accept()# 获取客户端的【握手】信息data = conn.recv(1024)print(data)def get_headers(data): """从请求头中取出Sec-WebSocket-Key对应的值并返回""" header_dict = {} header_str = data.decode("utf8") for i in header_str.split("\r\n"): if str(i).startswith("Sec-WebSocket-Key"): return i.split(":")[1].strip()# 得到Sec-WebSocket-Key对应的值ws_key = get_headers(data)# 魔法字符串magic string为:258EAFA5-E914-47DA-95CA-C5AB0DC85B11magic_string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'# 拼接socket_str = ws_key + magic_string# sha1加密socket_str_sha1 = hashlib.sha1(socket_str.encode("utf8")).digest()# base64加密socket_str_base64 = base64.b64encode(socket_str_sha1)# 拼接响应头response_tpl = "HTTP/1.1 101 Switching Protocols\r\n" \ "Upgrade:websocket\r\n" \ "Connection: Upgrade\r\n" \ "Sec-WebSocket-Accept: %s\r\n" \ "WebSocket-Location: ws://127.0.0.1:9527\r\n\r\n" % (socket_str_base64.decode("utf8"))# 服务器发送响应头到客户端conn.send(response_tpl.encode("utf8"))# 客户端服务端建立长连接循环接收发送数据while True: msg = conn.recv(8096) print(msg)

总结

以上是为你收集整理的html5 http的轮询和Websocket原理全部内容,希望文章能够帮你解决html5 http的轮询和Websocket原理所遇到的程序开发问题。