当前位置: 首页 > 工具软件 > Keen.js > 使用案例 >

Node.js 创建 WebSocket 服务

訾俊名
2023-12-01

Node.js 创建 WebSocket 服务

一、什么是WebSocket

WebSocket 是一种网络通信协议。WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

二、客户端API使用

简单实例

var ws = new WebSocket("wss://echo.websocket.org");

// 实例对象的onopen属性,用于指定连接成功后的回调函数。
ws.onopen = function(event) { 
  console.log("Connection open ..."); 
  ws.send("Hello WebSockets!");
};
// 实例对象的onmessage属性,用于指定收到服务器数据后的回调函数。
ws.onmessage = function(event) {
  console.log( "Received Message: " + evt.data);
  ws.close();
};

// 实例对象的onclose属性,用于指定连接关闭后的回调函数。
ws.onclose = function(evt) {
  var code = event.code;
  var reason = event.reason;
  var wasClean = event.wasClean;
  console.log("Connection closed.");
}; 
// 实例对象的onerror属性,用于指定报错时的回调函数。
ws.onerror = function(event) {
  // handle error event
};

webSocket.readyState

readyState属性返回实例对象的当前状态,共有四种。

  • CONNECTING:值为0,表示正在连接。
  • OPEN:值为1,表示连接成功,可以通信了。
  • CLOSING:值为2,表示连接正在关闭。
  • CLOSED:值为3,表示连接已经关闭,或者打开连接失败。

下面是一个示例。

switch (ws.readyState) {
  case WebSocket.CONNECTING:
    // do something
    break;
  case WebSocket.OPEN:
    // do something
    break;
  case WebSocket.CLOSING:
    // do something
    break;
  case WebSocket.CLOSED:
    // do something
    break;
  default:
    // this never happens
    break;
}

webSocket.send()

实例对象的send()方法用于向服务器发送数据。
发送文本的例子。

ws.send('your message');

webSocket.bufferedAmount

实例对象的bufferedAmount属性,表示还有多少字节的二进制数据没有发送出去。它可以用来判断发送是否结束。

var data = new ArrayBuffer(10000000);
socket.send(data);

if (socket.bufferedAmount === 0) {
  // 发送完毕
} else {
  // 发送还没结束
}

服务端的实现

WebSocket 服务器的实现
常用的 Node 实现有以下三种。

ws为例:
安装ws

npm install ws

服务端代码

const WebSocketServer = require('ws').Server

const wss = new WebSocketServer({ port: 8888 }) //服务端口8888
console.log('创建ws服务', 'ws://localhost:8888')
wss.on('connection', function (ws: any) {
  console.log('服务端:客户端已连接')
  ws.send('Hello Client!')
  ws.on('message', function (message: any) {
    //打印客户端监听的消息
    console.log('Client: ', message)
    ws.send('I revice your msg!')
  })
})

 类似资料: