作者在工作中开玩笑说使用nodejsnet.socket连接WebSocket服务器,所以写了一篇文章记录WebSocket的相关信息,并给出了实现WebSocket客户端的方法在节点中。WebSocket和socket的区别WebSocket是一种双向通信协议,客户端和服务器都可以发送和接收数据。Socket不是一个协议,而是应用层和传输层之间的一组接口。WebSocket处于应用层,建立在TCP连接之上。套接字处于传输层,用于建立TCP连接。套接字封装了复杂的TCP/IP协议,方便开发者实现TCP通信的功能。net.socket类是TCP套接字或流式IPC端点的抽象。详见net.socket是nodejs中用来实现socket通信的工具类,与WebSocket无关。关于WebSocketWebSocket的功能WebSocket是一个基于TCP的应用层协议,它实现了客户端和服务端的全双工通信,使得客户端和服务端都可以主动向对方发送数据。WebSocket连接一旦建立,后续数据以帧序列的形式在同一个持久连接上传输,节省了网络带宽。WebSocket适用于服务端不断有数据更新,客户端需要及时获取数据更新的情况。如果只使用HTTP,为了实时显示数据更新,客户端需要每隔一小段时间发起一次HTTP请求获取数据,检查是否有更新。使用WebSocket后,服务端可以在数据更新后通过WebSocket连接通知客户端更新的数据,实现实时显示,开销较小。WebSocket连接的建立过程客户端和服务端通过三次握手建立TCP连接。TCP连接成功后,客户端通过HTTP协议向服务端发送WebSocket支持的版本号等信息。服务端收到握手请求后,同样使用HTTP回复数据。客户端和服务端收到连接成功信息后,通过TCP通道进行通信。WebSocketClient的实现——运行在浏览器中,直接使用JS的WebSocket对象创建一个新的WebSocket实例并连接。连接和回调设置代码如下:varws=newWebSocket('ws://localhost:8080');ws.onopen=function(e){console.log("连接服务器成功");//向服务器发送消息ws.send("what`syourname?");}ws.onclose=function(e){console.log("服务器关闭");}ws.onerror=function(){console.log("连接错误");}//接收服务器的消息ws.onmessage=function(e){letmessage="message:"+e.data+"";控制台日志(消息);}注意:JSWebSocket对象只能在浏览器环境下访问。详情见这里Client-following方法也可以在Electron的主进程中实现,无需在浏览器中运行following方法。WebSocket-NodeWebSocket-Node使用WebSocket-Node创建WebSocket连接并设置回调。websocket').client;varclient=newWebSocketClient();client.on('connectFailed',function(error){console.log('ConnectError:'+error.toString());});client.on('connect',function(connection){console.log('WebSocketClientConnected');connection.send("what`syourname?");connection.on('error',function(error){console.log("ConnectionError:"+error.toString());});connection.on('close',function(){console.log('echo-protocolConnectionClosed');});connection.on('message',function(message){if(message.type==='utf8'){console.log("Received:'"+message.utf8Data+"'");}});functionsendNumber(){if(connection.connected){varnumber=Math.round(Math.random()*0xFFFFFF);connection.sendUTF(number.toString());setTimeout(sendNumber,1000);}}sendNumber();});//下面不能加'echo-protocol',否则会报Can`tconnectdueto"Sec-WebSocket-Protocolheader"错误因为服务端没有返回对应协议指定的信息client.connect('ws://localhost:8080/');//,'回声协议');wsws安装:https://github.com/websockets/ws使用ws创建WebSocket连接并设置回调的代码如下:varws=require("ws");//urlws://127.0.0.1:6080//创建客户端套接字,然后让客户端连接到服务器socketvarsock=newws("ws://localhost:8080/");sock.on("open",function(){console.log("连接成功!!!!");sock.send("HelloWorld");});sock.on("error",function(err){console.log("error:",err);});sock.on("close",function(){console.log("close");});sock.on("消息",函数(数据){console.log(数据);});服务器端nodejs-websocket安装:npminstallnodejs-websocket创建一个服务并设置一个回调函数:varws=require("nodejs-websocket")//Screamserverexample:"hi"->"HI!!!"varserver=ws.createServer(function(conn){console.log("Newconnection")conn.on("text",function(str){console.log("Received"+str)conn.sendText(str.toUpperCase()+"!!!")})conn.on("close",function(code,reason){console.log("Connectionclosed")})}).listen(8001)ws创建服务并设置回调函数:constWebSocket=require('ws');constwss=newWebSocket.Server({port:8080});wss.on('connection',functionconnection(ws){ws.on('message',functionincoming(message){console.log('received:%s',消息);});ws.send('something');});WebSocket与Socket.io这是另一个混??淆点。虽然socket.io和WebSocket都支持实时通信,但是不能混用。Socket.io不是Websocket,它只是将Websocket、轮询(Polling)机制等实时通信方式封装成一个通用的接口,并在服务端实现这些实时机制的相应代码。换句话说,Websocket只是用于实时通信的Socket.io的一个子集。因此,Websocket客户端无法连接到Socket.io服务器,当然Socket.io客户端也无法连接到Websocket服务器。具体来说,如果要使用socket.io进行实时通信,必须使用socket.io-client作为客户端,socket.io作为服务端。
