WebSocket(肆) 各种操作码

简介: 原文地址:https://www.web-tinker.com/article/20309.html 前面的例子都是用了1这个操作码(Opcode)来传输文本的。

原文地址:https://www.web-tinker.com/article/20309.html


前面的例子都是用了1这个操作码(Opcode)来传输文本的。没错,1这个操作码就是传输文本(UTF-8)的。还用到了在分片过程中把操作码设置为0,0也只是分片时用的。操作码是4位的,取值当然不止这两个,除了指定传输数据类型外还有其它用途的操作码。
  规范文档中也提供了一个表格

 |Opcode  | Meaning                             | Reference |
-+--------+-------------------------------------+-----------|
 | 0      | Continuation Frame                  | RFC 6455  |
-+--------+-------------------------------------+-----------|
 | 1      | Text Frame                          | RFC 6455  |
-+--------+-------------------------------------+-----------|
 | 2      | Binary Frame                        | RFC 6455  |
-+--------+-------------------------------------+-----------|
 | 8      | Connection Close Frame              | RFC 6455  |
-+--------+-------------------------------------+-----------|
 | 9      | Ping Frame                          | RFC 6455  |
-+--------+-------------------------------------+-----------|
 | 10     | Pong Frame                          | RFC 6455  |
-+--------+-------------------------------------+-----------|

目前就这么多个操作码被定义,其它都是预留的。0和1这两个之前的例子用过的就不说了。2这个操作码是告诉服务器不要把数据转换成字符串,直接当做二进制数据来用。这会在传输图片之类的操作中用到,至于传输图片的例子以后再给吧。这篇主要是介绍后三个操作码。
  8这个操作码是服务器向客户端请求结束当前连接用的,不要以为这很简单,WebSocket的建立连接需要握手协议,那么关闭也需要双方的协商,还有关闭的代码什么的,总之很麻烦,下回再介绍。
  9和10这两个状态码就简单些了,它们是成对的。服务器向客户端发送一个Ping帧时客户端会自动返回一个Pong帧,并且数据部分与发送的完全相同。如果不同或收不到,则说明网络有问题。下面是例子
  (encodeDataFrame与decodeDataFrame函数见生成数据帧和解析数据帧)

//客户端程序
var ws=new WebSocket("ws://127.0.0.1:8000");

//服务器程序
var crypto=require('crypto');
var WS='258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
require('net').createServer(function(o){
  var key;
  o.on('data',function(e){
    if(!key){
      //握手
      key=e.toString().match(/Sec-WebSocket-Key: (.+)/)[1];
      key=crypto.createHash('sha1').update(key+WS).digest('base64');
      o.write('HTTP/1.1 101 Switching Protocols\r\n');
      o.write('Upgrade: websocket\r\n');
      o.write('Connection: Upgrade\r\n');
      o.write('Sec-WebSocket-Accept: '+key+'\r\n');
      o.write('\r\n');
      //握手成功后给客户端发送个Ping包
      o.write(encodeDataFrame({FIN:1,Opcode:9,PayloadData:"数据"}));
    }else{
      //解析客户端传过来的数据帧并输出
      var data=decodeDataFrame(e);
      data.PayloadData=data.PayloadData.toString();
      console.log(e);
    };
  });
}).listen(8000);

Chrome调试工具截图:


NodeJS控制台截图:



目录
相关文章
|
6月前
|
安全 网络协议 算法
AH 协议详解
【2月更文挑战第25天】
|
4月前
|
数据采集 网络协议 Python
🔍HTTP协议不为人知的秘密:Python网络编程高手是如何炼成的?
【7月更文挑战第29天】探索HTTP协议核心—请求与响应的交互:浏览器发送请求至服务器,后者处理后返回资源数据与状态码(如200表示成功)。Python高手需理解这些机制并掌握工具如`requests`库。HTTP头信息(Headers)含元数据如`User-Agent`、`Content-Type`及`Cookie`用于会话管理。尽管HTTP无状态,但可通过`Cookie`和`Session`模拟状态保持。成为高手之路包括:深入理解协议、实践项目、阅读优秀库源码如`requests`、跟进新技术如HTTP/2与HTTP/3,并积极参与社区交流。
25 1
|
6月前
|
传感器 存储 安全
MQTT:通信协议的三位主角
【4月更文挑战第20天】
774 0
|
缓存 前端开发 应用服务中间件
直播程式源码平台细讲HTTP协议:超文本传输—山东布谷科技魏创作
在直播程式源码平台中,HTTP协议扮演着数据传输的重要角色,HTTP协议能够让直播程式源码平台获取和发送数据、让用户的操作能够建立客户端与用户端的通信连接与缓存和代理支持,这些都能让用户在直播程式源码平台获得稳定、流畅的直播体验,满足用户对高质量内容的需求,是直播程式源码平台不可或缺的优质协议之一。
直播程式源码平台细讲HTTP协议:超文本传输—山东布谷科技魏创作
|
传感器
一文教你彻底学会IIC协议
一文教你彻底学会IIC协议
584 1
|
网络性能优化
【数字IC】深入浅出理解AXI协议
【数字IC】深入浅出理解AXI协议
【数字IC】深入浅出理解AXI协议
蓝桥杯之单片机学习(十九)——IIC协议(PCF8591、AT24C02)
蓝桥杯之单片机学习(十九)——IIC协议(PCF8591、AT24C02)
241 0
蓝桥杯之单片机学习(十九)——IIC协议(PCF8591、AT24C02)
|
开发者 SoC
【数字IC】深入浅出理解UART协议
【数字IC】深入浅出理解UART协议
【数字IC】深入浅出理解UART协议
|
机器学习/深度学习 搜索推荐 算法
Lec4 基于内容和知识的推荐 | 学习笔记
快速学习 Lec4 基于内容和知识的推荐 。
|
存储 网络协议 Unix
万字长文爆肝 DNS 协议!(一)
试想一个问题,我们人类可以有多少种识别自己的方式?可以通过身份证来识别,可以通过社保卡号来识别,也可以通过驾驶证来识别,尽管我们有多种识别方式,但在特定的环境下,某种识别方法可能比另一种方法更为适合。因特网上的主机和人类一样,可以使用多种识别方式进行标识。互联网上主机的一种标识方法是使用它的 主机名(hostname) ,如 www.facebook.com、 www.google.com 等。但是这是我们人类的记忆方式,路由器不会这么理解,路由器喜欢定长的、有层次结构的 IP地址。
万字长文爆肝 DNS 协议!(一)