经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
WebSocket魔法师:打造实时应用的无限可能
来源:cnblogs  作者:京东云开发者  时间:2023/11/10 10:07:32  对本文有异议

1、背景

在开发一些前端页面的时候,总是能接收到这样的需求:如何保持页面并实现自动更新数据呢?以往的常规做法,是前端使用定时轮询后端接口,获取响应后重新渲染前端页面,这种做法虽然能达到类似的效果,但是依然有很多缺点,缺点就不在这里说了,感兴趣的小伙伴可以自行查阅一下。现在让我们回忆一下,我们有没有想过,是否有一种技术,服务器可以主动将数据推送给客户端进行渲染,而不再是客户端向服务器发出请求等待返回结果呢?接下来,让我们一起了解weboskcet。

2、什么是websocket

websocket是HTML5规范的一个部分,它借鉴了socket的思想,实现了浏览器与服务器全双工通信,达到了即时通信的效果。websocket协议基于TCP协议实现,包含初始的握手过程,以及后续的多次数据帧双向传输过程,避免服务器频繁打开多个HTTP连接,从而能更好的节省服务器资源和带宽,提高工作效率与资源利用率

3、工作原理

websocket的通信规范,首先浏览器通过HTTP协议发出websocket的连线请求,服务器进行响应,这个过程称为握手,握手完成后,客户端和服务器之间建立一个类似TCP的连接,使用websocket协议,从而实现它们之间的通信。

4、与HTTP的关系

相同点:

1、都是基于TCP协议,且都是可靠性传输协议;

2、都是应用层协议;

3、websocket支持两种资源标志符ws(默认80端口)与wss(默认443端口),类似HTTP和HTTPS;

不同点:

1、websocket是双向通信协议,HTTP是单向的;

2、websocket是需要浏览器和服务器握手进行建立连接的,HTTP是浏览器发起向服务器的连接,服务器预先并不知道这个连接。

联系点:

websocket在建立握手时,数据是通过HTTP传输的,建立之后的数据传输将不再需要HTTP协议,而是websocket协议;

5、websocket创建与常用的属性方法

5.1 websocket属性

属性 描述
readyState 只读属性 readyState 表示连接状态,可以是以下值:0 :表示连接尚未建立。1 :表示连接已建立,可以进行通信。2 :表示连接正在进行关闭。3 :表示连接已经关闭或者连接不能打开。
bufferedAmount 只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。
CONNECTING 值为0,表示正在连接
OPEN 值为1,表示连接已建立,可以进行通信
CLOSING 值为2,表示连接正在关闭
CLOSED 值为3,表示连接已经关闭或者连接不能打开
  1. // 创建websocket
  2. var ws = new WebSocket("ws://www.example.com");
  3. if(ws.readyState == ws.CONNECTING){
  4. console.log('连接正在打开');
  5. }
  6. ws.onopen = function () {
  7. ws.send(consumerId);
  8. if(ws.readyState == ws.CONNECTING){
  9. console.log('连接正在打开1');
  10. }
  11. if(ws.readyState == ws.OPEN){
  12. console.log('连接已打开');
  13. }
  14. console.log('已经建立连接');
  15. // 关闭连接
  16. // ws.close()
  17. };
  18. // 连接关闭时触发
  19. ws.onclose = function () {
  20. if(ws.readyState == ws.CLOSED){
  21. console.log('连接已关闭')
  22. }
  23. };
  24. // 连接错误
  25. ws.onerror = function () {
  26. console.log('连接错误');
  27. };

5.2 weboscket事件

事件 处理程序 描述
open onopen 连接建立时触发
message onmessage 接收消息时触发
error onerror 发生错误时触发
close onclose 关闭连接时触发

5.3 客户端的简单示例

  1. // 创建websocket
  2. var ws = new WebSocket("ws://www.example.com");
  3. // 连接成功时触发
  4. ws.onopen = function(e) {
  5. console.log("Connectiong open ...");
  6. // 发送消息
  7. ws.send("Hello WebSocket");
  8. };
  9. // 接收消息时触发
  10. ws.onmessage = function(e) {
  11. console.log("Received Message: " + e.data);
  12. ws.close();
  13. };
  14. // 关闭连接时触发
  15. ws.onclose = function(e) {
  16. console.log("Connection closed");
  17. };
  18. // 出现错误时触发
  19. ws.onerror = function(e) {
  20. console.log("error");
  21. };

5.4 服务端的简单示例

  1. # 创建websocket服务端
  2. from tornado.websocket import WebSocketHandler
  3. class wsHandler(WebSocketHandler):
  4. # 保存连接的用户,用于后续推送消息
  5. connect_users = set()
  6. # 已与客户端建立连接
  7. def open(self):
  8. print("开启WebSocket opened")
  9. self.connect_users.add(self)
  10. # 关闭客户端连接
  11. def on_close(self):
  12. self.connect_users.remove(self)
  13. # 接收到消息
  14. def on_message(self, message):
  15. self.write_message("接收到客户端的消息:{}".format(message))
  16. # 所有用户发送消息
  17. @classmethod
  18. def send_demand_updates(cls, message):
  19. # 使用@classmethod可以使类方法在调用的时候不用进行实例化
  20. # 给所有用户推送消息(此处可以根据需要,修改为给指定用户进行推送消息)
  21. for user in cls.connect_users:
  22. user.write_message(message)
  23. # 允许WebSocket的跨域请求
  24. def check_origin(self, origin):
  25. return True
  26. if __name__ == "__main__":
  27. # 调用
  28. wsHandlersend_demand_updates("服务端发送给客户端的消息")

注意:示例中使用python语言,需依托tornado框架搭建后端web服务端,文章中不再说明如何搭建服务端,感兴趣的小伙伴可自行尝试。tornado内置websocket模块,能更简单的支持使用websocket。

6、总结

websocket提供了一种低延迟、高性能的双向数据通信,不同与web开发的请求、处理、等待响应模式,它是客户端、服务端因为同一个连接直接就可以数据互传的模式,特别适合实时数据交互的应用进行开发。

实用点:

1、websocket连接建立后,后续的数据传输都将以帧序列的形式传输;

2、在客户端断开websocket连接或服务端中断连接前,不需要客户端和服务端重新发起连接请求;

3、在海量并发、客户端与服务器交互负载流量大的情况下,节省网络带宽资源的消耗,且客户端发送与接收消息,都是在同一个持久连接上进行,实现了“真长连接”,真正的实现即时通信。

作者:京东物流 骆铜磊

来源:京东云开发者社区 自猿其说Tech 转载请注明来源

原文链接:https://www.cnblogs.com/Jcloud/p/17819093.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号