WebSocket(肆) 各种操作码

简介: 前面的例子都是用了1这个操作码(Opcode)来传输文本的。


前面的例子都是用了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控制台截图:



目录
相关文章
|
8月前
|
存储 知识图谱
【计算机组成原理】指令系统&考研真题详解之拓展操作码!
也就是说 “其中三地址指令29”条这句话,完全可以翻译成“三地址这种类型的指令一共能有29种不同的可能性” 这样说就清晰多 因为这就意味着 我们需要用若干个字节 来表示这29种不同的可能性 然后又已知每一个字节位能表示的可能性是2种(0/1),那么我们想有多少个字节可以表示29种不同的可能呢?最少5种 (因为2的4次方=16<29),2^5=32>29,也就是说有32-29=3种可能性是不在三地址指令这种类型的指令集里面的,所以这3 种余出来的可能性要被利用 就在下一种 “二地址指令集”中利用到
149 0
|
9月前
|
文字识别 定位技术
介绍几个有趣的网站(二十六)
介绍几个有趣的网站(二十六)
853 0
【异步FIFO的一些小事·1】空满判断与格雷码
【异步FIFO的一些小事·1】空满判断与格雷码
408 0
【异步FIFO的一些小事·1】空满判断与格雷码
|
程序员 C语言 C++
C++之指针扫盲
C++进阶之指针扫盲
96 0
|
存储 网络协议 Linux
麻了,被字节问懵逼了!
SYN 报文什么时候情况下会被丢弃?
麻了,被字节问懵逼了!
|
JavaScript 前端开发 数据可视化
字节不给大伙发月饼?🎑那我亲自给大伙发!🥮人人都有!
字节不给大伙发月饼?🎑那我亲自给大伙发!🥮人人都有!
|
Web App开发 存储 缓存
万字长文爆肝 DNS 协议!(二)
试想一个问题,我们人类可以有多少种识别自己的方式?可以通过身份证来识别,可以通过社保卡号来识别,也可以通过驾驶证来识别,尽管我们有多种识别方式,但在特定的环境下,某种识别方法可能比另一种方法更为适合。因特网上的主机和人类一样,可以使用多种识别方式进行标识。互联网上主机的一种标识方法是使用它的 主机名(hostname) ,如 www.facebook.com、 www.google.com 等。但是这是我们人类的记忆方式,路由器不会这么理解,路由器喜欢定长的、有层次结构的 IP地址。
万字长文爆肝 DNS 协议!(二)
|
存储 网络协议 Unix
万字长文爆肝 DNS 协议!(一)
试想一个问题,我们人类可以有多少种识别自己的方式?可以通过身份证来识别,可以通过社保卡号来识别,也可以通过驾驶证来识别,尽管我们有多种识别方式,但在特定的环境下,某种识别方法可能比另一种方法更为适合。因特网上的主机和人类一样,可以使用多种识别方式进行标识。互联网上主机的一种标识方法是使用它的 主机名(hostname) ,如 www.facebook.com、 www.google.com 等。但是这是我们人类的记忆方式,路由器不会这么理解,路由器喜欢定长的、有层次结构的 IP地址。
万字长文爆肝 DNS 协议!(一)
|
域名解析 存储 网络协议
万字长文爆肝 DNS 协议!(三)
试想一个问题,我们人类可以有多少种识别自己的方式?可以通过身份证来识别,可以通过社保卡号来识别,也可以通过驾驶证来识别,尽管我们有多种识别方式,但在特定的环境下,某种识别方法可能比另一种方法更为适合。因特网上的主机和人类一样,可以使用多种识别方式进行标识。互联网上主机的一种标识方法是使用它的 主机名(hostname) ,如 www.facebook.com、 www.google.com 等。但是这是我们人类的记忆方式,路由器不会这么理解,路由器喜欢定长的、有层次结构的 IP地址。
万字长文爆肝 DNS 协议!(三)
|
存储 小程序

热门文章

最新文章