如何编写一个websocket客户端

我试图在node.js上unit testing我的websocket,并想模拟一个websocket客户端。 我可以创build一个只连接到我的服务器的HTML文件,但是我不能在服务器上运行一个testing。

我将如何去(使用http.Clientnet.Stream )创build一个websocket客户端,并与我的服务器交互。

我正在瞄准websocket规范(即将死亡)的草案76。

我正在使用的服务器端实现是这样的

既然你已经知道目前所有的WebSocket版本都将很快被淘汰,而且你使用的是支持旧版本的WebSocket服务器,如果你已经有一些服务器代码了,那么创build一个WebSocket服务器是相当简单的,所以不需要“安全”标题的东西在76。

免责声明:这个东西只有5分钟的testing,但它应该在大部分的工作。

代码如下史诗般的墙

 var net = require('net'); function WebSocket(host, port, encoder, decoder) { this.encoder = encoder || function(data){return data.toString()}; this.decoder = decoder || function(data){return data}; this.socket = net.createConnection(port, host); this.connected = false; this.header = 0; this.bytesSend = 0; this.dataFrames = []; this.dataState = 0; var that = this; process.nextTick(function() { that.init(host, port); }); } // Prototype ------------------------------------------------------------------- WebSocket.prototype = { onConnect: function() {console.log('connect');}, onClose: function() {console.log('close');}, onData: function(data) {console.log(data)}, init: function(host, port) { var that = this; this.socket.addListener('connect', function() { var data ='GET / HTTP/1.1\r\n' + 'Host: ' + host + ':' + port + '\r\n' + 'Origin: websocket.node.js\r\n' + 'Connection: Upgrade\r\n' + 'Upgrade: WebSocket\r\n\r\n'; that.socket.write(data, 'ascii'); that.socket.flush(); }); this.socket.addListener('data', function(data) {that.read(data);}); this.socket.addListener('end', function() {that.onClose();}); this.socket.addListener('error', function(e) {console.log(e.message);that.close();}); }, send: function(data, encoded) { if (this.connected) { return this.write(encoded ? data : this.encoder(data)); } else { return 0; } }, close: function() { if (this.connected) { this.connected = false; this.write(null); this.socket.end(); this.socket.destroy(); } }, read: function read(data) { for(var i = 0, l = data.length; i < l; i++) { var b = data[i]; if (this.header < 4) { if ((this.header === 0 || this.header === 2) && b === 0x0d) { this.header++; } else if ((this.header === 1 || this.header === 3) && b === 0x0a) { this.header++; } else { this.header = 0; } if (this.header === 4) { this.connected = true; this.onConnect(); this.header = 5; } } else { if (this.dataState === 0) { this.dataState = b & 0x80 === 0x80 ? 2 : 1; // Low bit frame } else if (this.dataState === 1) { if (b === 0xff) { var buffer = new Buffer(this.dataFrames); this.dataFrames = []; this.dataState = 0; if (!this.message(buffer.toString('utf8', 0, buffer.length))) { this.send({error: 'Invalid Message.'}); this.close(); return; } } else { this.dataFrames.push(b); } // Unused high bit frames } else if (this.dataState === 2) { if (b === 0x00) { this.close(); } } } } }, write: function(data) { var bytes = 0; if (!this.socket.writable) { return bytes; } try { this.socket.write('\x00', 'binary'); if (typeof data === 'string') { this.socket.write(data, 'utf8'); bytes += Buffer.byteLength(data); } this.socket.write('\xff', 'binary'); this.socket.flush(); bytes += 2; } catch(e) {} this.bytesSend += bytes; return bytes; }, message: function(msg) { if (this.decoder) { try { msg = this.decoder(msg); } catch(e) { this.close(); return false; } } this.onData(msg); return true; } }; 

在这里我们设置它:

 var bison = require('bison'); // automatically do some encoding/decoding magic var test = new WebSocket('localhost', 28785, bison.encode, bison.decode); test.onConnect = function() { }; test.onData = function(data) { }; 

随意在评论中提问。

PS:有关如何工作的信息,请阅读规范:P

看看wiki上的模块页面 ,它有一些用于npm的 websocket客户端模块。