WebSocket学习笔记

1 篇文章 0 订阅

1、什么是WebSocket

  • 定义:WebSocket是一种区别于HTTP协议的通信协议,可在单个TCP连接上进行全双工通信。
  • 主要功能:提供客户端和服务端的双向数据推送
  • 应用场景:实时弹幕、股票、在线聊天等
  • 特点:
    • 握手阶段采用 HTTP 协议。
    • 数据格式轻量,性能开销小。客户端与服务端进行数据交换时,服务端到客户端的数据包头只有2到10字节,客户端到服务端需要加上另外4字节的掩码。而HTTP请求每次都需要携带完整头部。
    • 更好的二进制支持,可以发送文本,和二进制数据
    • 没有同源限制,客户端可以与任意服务器通信
    • 协议标识符是ws(如果加密,则是wss),请求的地址就是后端支持websocket的API。

注:webSocket是一种底层协议,日常开发中通常会搭配socket.js 和 stomp.js 等库来实现附加的功能,比如数据加密、身份认证等
以下代码都默认安装了以上两个js库

2、创建

2.1 默认使用浏览器原生 Websocket

import Stomp from 'stomp'
//...
const url = "ws://localhost:61614/stomp"
const client = Stomp.client(url)
//...

2.2 使用浏览器原生 Websocket

import Stomp from 'stomp'
import SocktJs from 'socketjs'
//...
const ws = new SocktJs(url);
const client = Stomp.over(ws);
//...

3、连接

3.1不提供headers

client.connect(login, passcode, connectCallback);
client.connect(login, passcode, connectCallback, errorCallback);
client.connect(login, passcode, connectCallback, errorCallback, host);

3.2提供headers

client.connect(headers, connectCallback);
client.connect(headers, connectCallback, errorCallback);

4、断开连接

client.disconnect(disconnectCallback)

5、断开连接

client.heartbeat.outgoing = 20000;  // 客户端每20000ms发送一次心跳
client.heartbeat.incoming = 0;  // 客户端将不接受从服务器发送的心跳

6、数据发送

stomp的消息体必须是一个string,传递对象时使用JSON.stringfy()来解决

client.send(url, headers, body);
//当不需要设置headers时,第二个参数设置为{}
client.send(url, {}, body);

7、数据订阅

const subscription = client.subscribe(url, callback,[headers]);

subscribe()方法返回一个对象,包含一个id属性和一个unsubscribe方法,使用次方法可以取消当前订阅subscription.unsubscribe()
当headers中没有提供id属性的时候,stomp库会默认返回一个unique ID

//使用自定义id
const mysubid = 'myCustomId';
const subscription = client.subscribe(destination, callback, { id: mysubid });

数据过滤

const headers = {ack: 'client', 'selector': "location = 'Europe'"};
client.subscribe("/queue/test", message_callback, headers);

客户端将只会在接受的数据匹配 location = 'Europe' 时才会触发 message_callback

8、消息确认机制

默认情况下,STOMP消息将在被传递到客户端之前由服务器自动确认。客户端可以通过在订阅消息时设置 ack headers 来自行处理消息确认逻辑。在这种情况下,客户端必须使用message.ack()方法来通知服务器它已确认该消息。

  const subscription = client.subscribe("/queue/test",
    function(message) {
      // do something with the message
      ...
      // and acknowledge it
      message.ack();
    },
    {ack: 'client'}
  );

ack()方法接受一个具备transaction字段的参数:heades

  const tx = client.begin();
  message.ack({ transaction: tx.id, receipt: 'my-receipt' });
  tx.commit();

对应的 nack() 方法通知服务器消息没被确认;
客户端使用其begin()方法启动事务,该方法采用可选事务,即标识事务的唯一字符串。如果未设置事务,则库将自动生成一个事务。
此方法返回一个JavaScript对象,该对象具有一个与事务ID对应的id属性和两个方法:

  • commit() //提交事务
  • abort() // 中断事务
	// start the transaction
  const= client.begin();
  // send the message in a transaction
  client.send("/queue/test", {transaction: tx.id}, "message in a transaction");
  // commit the transaction to effectively send the message
  tx.commit();

如果您在调用send()时忘记添加事务头,则该消息将不属于事务,并且将直接发送,而无需等待事务完成。

const = "unique_transaction_identifier";
// start the transaction
const = client.begin();
// oops! send the message outside the transaction
client.send("/queue/test", {}, "I thought I was in a transaction!");
tx.abort(); // Too late! the message has been sent
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTML5(HyperText Markup Language 5)是一种用于构建和呈现网页内容的标准的最新版本。它是由万维网联盟(W3C)开发和维护的,旨在取代之前的HTML版本。 HTML5具有许多新的功能和特性,使得网页设计和开发更加灵活和强大。其中一些突出的特点包括: 1. 语义化标签:HTML5引入了新的语义标签,如<header>、<nav>、<section>和<footer>等,使网页结构更具可读性和可访问性。 2. 视频和音频支持:HTML5内置了<video>和<audio>标签,使得在网页中嵌入和播放视频和音频变得更加简单和无需依赖插件。 3. Canvas绘图:HTML5的<canvas>元素允许开发者使用JavaScript绘制图形、动画和游戏等,提供了更强大的图形处理能力。 4. 本地存储:HTML5提供了本地存储功能,包括LocalStorage和SessionStorage,可以在客户端存储数据,减少对服务器的请求,提高网页性能。 5. 响应式设计:HTML5支持响应式布局,即能够根据设备的屏幕大小和分辨率自动调整网页的布局和样式,提供更好的用户体验。 6. WebSocket通信:HTML5引入了WebSocket API,允许实时双向通信,使得开发者可以创建更快速、实时的应用程序。 HTML5的广泛应用使得网页开发更加便捷和创新。它不仅可以用于构建传统的网页和博客,还可以用于开发移动应用、游戏、视频播放器等。同时,HTML5也具有更好的兼容性和跨平台性,可以在不同的浏览器和操作系统上运行。 总之,HTML5的出现为网页设计和开发带来了新的可能性和优势,使得用户能够获得更丰富、交互性更强的网页内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值