Websocket协议详解
关于websocket的协议是用来干嘛的,请参考其他文章。
WebSocket关键词
HTML5协议,实时,全双工通信,长连接
WebSocket比传统Http的好处
- 客户端与服务端只建立一个TCP连接,可以使用更少的连接
- WebSocket的服务端可以将数据推送到客户端,如实时将证券信息反馈到客户端(这个很关键),实时天气数据,比http请求响应模式更灵活
- 更轻量的协议头,减少数据传送量
数据帧格式
下图为手工打造的数据帧格式
/**
* fin |masked | |
* srv1 | length | |
* srv2 | (7bit |mask数据 |payload
* srv3 | 7+2字节 | 4字节 |真实数据
opcode | 7+64字节 | |
*(4bit)
*/
作以下说明:
- 前8个bit(一个字节)
—fin: 是否数据发送完成,为1发送完成为0发送未完。
—srv1,srv2,srv3:留作后用
—opcode:数据类型操作码,4bit表示,其中
TEXT: 1, text类型的字符串
BINARY: 2,二进制数据,通常用来保存图片
CLOSE: 8,关闭连接的数据帧。
PING: 9, 心跳检测。ping
PONG: 10,心跳检测。pong
var events = require('events');
var http = require('http');
var crypto = require('crypto');
var util = require('util');
/**
* 数据类型操作码 TEXT 字符串
* BINARY 二进制数据 常用来保存照片
* PING,PONG 用作心跳检测
* CLOSE 关闭连接的数据帧 (有很多关闭连接的代码 1001,1009,1007,1002)
*/
var opcodes = {
TEXT: 1,
BINARY: 2,
CLOSE: 8,
PING: 9,
PONG: 10
};
var WebSocketConnection = function (req, socket, upgradeHead) {
"use strict";
var self = this;
var key = hashWebSocketKey(req.headers['sec-websocket-key']);
/**
* 写头
*/
socket.write('HTTP/1.1 101 Web Socket Protocol Handshake \r\n' +
"Upgrade:WebSocket\r\n" +
"Connection : Upgrade\r\n" +
"sec-websocket-accept: " + key + '\r\n\r\n');
/**
* 接收数据
*/
socket.on('data', function (buf) {
self.buffer = Buffer.concat([self.buffer, buf]);
while (self._processBuffer()) {
}
});
socket.on('close', function (had_error) {