原文链接 https://www.web-tinker.com/article/20305.html
WebSocket(壹) 握手连接
WebSocket虽然很先进,很好用,但却是个很麻烦的东西。与普通的Web通信机制不同,它本身可以算是一个协议。要使用WebSocket首先得让客户端和服务器建立连接,而且这个连接蛋疼的比TCP那样的传输层协议还复杂,需要通过验证KEY来做握手工作。这个握手协议使用的是HTTP格式的请求,并再头部分带上一个Sec-WebSocket-Key字段,服务器对这个字段加上一个特定的字符串后做一次sha1运算,然后把结果用Base64的形式以同样的方式发送回去就可以完成握手的工作了。当然,WebSocket这个协议还在不断完善更新,目前这么用是没问题的,历史版本中还出现过其它方式,这里就无视他们了。
下面是足以完成握手的服务器端程序,使用NodeJS。
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 key=e.toString().match(/Sec-WebSocket-Key: (.+)/)[1]; //连接上WS这个字符串,并做一次sha1运算,最后转换成Base64 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'); //这个字段带上服务器处理后的KEY o.write('Sec-WebSocket-Accept: '+key+'\r\n'); //输出空行,使HTTP头结束 o.write('\r\n'); }else{ //数据处理 }; }); }).listen(8000);
客户端一段简单的代码即可
var ws=new WebSocket("ws://127.0.0.1:8000"); ws.onerror=function(e){ console.log(e); }; ws.onopen=function(){ console.log("握手成功"); };
一旦握手成功就会触发open事件,否则触发error事件。在open之后就可以进行数据传输了,至于数据要如何传输这比这个握手连接要复杂的多,咱下一篇再说。