通讯(3)(websocket)

WebSocket

它实现了浏览器与服务器全双工通信(full-duplex),可以传输基于消息的文本和二进制数据。WebSocket简单的API背后隐藏了很多复杂性。他还提供了更多的服务:

  • 连接协商和同源策略
  • 与既有 HTTP 基础设施的互操作
  • 基于消息的通信和高效消息分帧
  • 子协议协商及可扩展能力

API

var ws = new WebSocket('[wss://xxxxxxxxx'](https://link.jianshu.com?t=wss://xxxxxxxxx'))
// 建立连接
ws.onerror = function () { // do something }
// 错误调用
ws.onclose = function () { ... }
// 关闭时调用
ws.onopen = function () {
// 连接建立时调用
ws.send("Connection established. Hello server!");
> // 向服务端发送消息
}

接受数据与发送数据

处理数据

ws.onmessage = function(msg) {
  // 接收服务端发送的消息
  if(msg.data instanceof Blob) {
  // 处理二进制信息
    processBlob(msg.data);
  } else {
    processText(msg.data);
    // 处理文本信息
  }
}

应用只需监听onmessage事件,用回调处理返回数据即可。 WebSocket支持文本和二进制数据传输,浏览器如果接收到文本数据,会将其转换为DOMString 对象,如果是二进制数据或Blob 对象,可直接将其转交给应用或将其转化为ArrayBuffer,由应用对其进行进一步处理。
详细处理:

wss.onmessage = function(msg) {
  if (msg.data instanceof ArrayBuffer) {
    processArrayBuffer(msg.data);
  } else {
    processText(msg.data);
  }
}

发送

ws.onopen = function () {
  socket.send("Hello server!");
  socket.send(JSON.stringify({'msg': 'payload'}));
  var buffer = new ArrayBuffer(128);
  socket.send(buffer);
  var intview = new Uint32Array(buffer);             
  socket.send(intview);
  var blob = new Blob([buffer]);
  socket.send(blob);
}

名称解释:
Blob
ArrBuffer

Blob 对象是包含有只读原始数据的类文件对象,可存储二进制数据,它会被写入磁盘;ArrayBuffer (缓冲数组)是一种用于呈现通用、固定长度的二进制数据的类型,作为内存区域可以存放多种类型的数据。
对于将要传输的二进制数据,开发者可以决定以何种方式处理,可以更好的处理数据流,Blob 对象一般用来表示一个不可变文件对象或原始数据,如果你不需要修改它或者不需要把它切分成更小的块,那这种格式是理想的;如果你还需要再处理接收到的二进制数据,那么选择ArrayBuffer 应该更合适。

ws
wss

WebSocket 资源URI采用了自定义模式:ws 表示纯文本通信( 如ws://example.com/socket),wss 表示使用加密信道通信(TCP+TLS)。为什么不使用http而要自定义呢?
WebSocket 的主要目的,是在浏览器中的应用与服务器之间提供优化的、双向通信机制。可是,WebSocket 的连接协议也可以用于浏览器之外的场景,可以通过非HTTP协商机制交换数据。

  • ws协议:普通请求,占用与http相同的80端口
  • wss协议:基于SSL的安全传输,占用与tls相同的443端口。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 在WebSocket之前,开发者完成实时通讯大抵都是求助一些‘hacks’来实现实时通讯。最流行的一种方式是...
    O8阅读 1,718评论 0 2
  • 转载自WebSocket,侵删 WebSocket 教程 作者: 阮一峰 WebSocket 是一种网络通信协议,...
    三十五岁是码农阅读 512评论 0 0
  • 一、内容概览 WebSocket的出现,使得浏览器具备了实时双向通信的能力。本文由浅入深,介绍了WebSocket...
    Calvin李阅读 2,621评论 2 10
  • 二进制数组(ArrayBuffer对象、TypedArray视图和DataView视图)是JavaScript操作...
    呼呼哥阅读 21,487评论 2 12
  • 如果对你的未来,我只能提供一个忠告,那就是防晒油。 防晒油的长期好处已经被科学家证实。不过,我的意见只限于自己曲折...
    乔拙阅读 263评论 0 0

友情链接更多精彩内容