浅析nodejs实现Websocket的数据接收与发送

浅析Node.js实现WebSocket的数据接收与发送

什么是WebSocket

WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务器端之间可以进行实时数据交换和数据推送而无需采取轮询方式,从而减少了网络流量和延迟。

WebSocket的实现过程

从客户端到服务器

  1. 客户端和服务器握手建立连接,此时会发送HTTP header(包括ws协议头),告知服务器要进行协议升级,升级成WebSocket协议。
  2. 服务器端回复HTTP header,告知客户端连接已建立并设置好WebSocket协议。
  3. 连接建立成功后,客户端和服务器端通过底层的TCP/IP协议进行双向通信,这种通信是异步的,能发送和接收数据(文本或二进制)

从服务器到客户端

  1. 服务器端处理客户端发送的请求,准备数据并进行数据编码,发送给客户端。
  2. 客户端接收到服务器端的消息,进行解码,得到数据。如果需要,再交由后续的应用层进行处理和展示。

Node.js实现WebSocket

客户端实现

如果是在Web环境下,可以直接使用WebSocket API,创建WebSocket连接:

const socket = new WebSocket('ws://localhost:3000');

这里创建了一个WebSocket对象,并连接到node.js服务器上。连接地址为ws://localhost:3000,即本地服务器的3000端口。

配置连接的监听器,接受服务器端返回的消息:

socket.addEventListener('message', function (event) {
   console.log('Message from server: ', event.data);
});

这里可以处理在服务器端发送的消息。

发送消息的方法:

socket.send('Hello Server!');

向服务器端发送消息的时候,可以直接调用send方法。

服务器端实现

服务器端首先需要安装websocket库:

npm install ws

使用ws模块创建WebSocket服务器:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3000 });

这里创建一个WebSocket.Server实例,并指定端口为3000。

接下来需要监听客户端连接的事件:

wss.on('connection', function connection(ws) {
  console.log('Client connected');

  ws.on('message', function incoming(data) {
    console.log('received from client:', data);
  });

  ws.send('Hello Client!');
});

这里使用on方法监听客户端连接事件,当连接建立时,会把一个WebSocket对象作为参数传入connection事件回调函数中,通过这个对象可以实现与客户端的通信。

可以使用send方法向客户端发送消息,通过监听message事件接收客户端发送的消息。

实例1:聊天室

下面将使用上述WebSocket实现方法和Node.js express框架,搭建一个简单的聊天室。

1. 客户端

在HTML文件中创建一个连接到服务器的WebSocket对象,并实现数据接收和发送:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Chat Room</title>
</head>
<body>
    <input type="text" id="inputMsg" placeholder="Your message">
    <button onClick="sendMessage()">Send</button>
    <ul id="messageList"></ul>
</body>
<script>
    var socket = new WebSocket('ws://localhost:3001');

    socket.addEventListener('message', function (event) {
        console.log('Message from server: ', event.data);
        showMessage(event.data);
    });

    function sendMessage(){
        var inputMsgElement = document.getElementById('inputMsg');
        var message = inputMsgElement.value;
        inputMsgElement.value = "";
        socket.send(message);
    }

    function showMessage(message){
        var ulElement = document.getElementById('messageList');
        var li = document.createElement("li");
        li.appendChild(document.createTextNode(message));
        ulElement.appendChild(li);
    }
</script>
</html>

这里的sendMessage方法将会把用户输入的消息发送给后端服务器。

2. 服务器端

使用express框架创建一个http服务器,然后在服务器端实现WebSocket的连接:

const express = require('express');
const WebSocket = require('ws');
const app = express();
const server = app.listen(3001, () => console.log('Server listening on port 3001!'));
const wss = new WebSocket.Server({ server });

app.use(express.static('public'));

wss.on('connection', function connection(ws) {
  console.log('Client connected');

  ws.on('message', function incoming(data) {
    console.log('received from client:', data);
    wss.clients.forEach(function each(client) {
      if (client.readyState === WebSocket.OPEN) {
        client.send(data);
      }
    });
  });
});

这里的逻辑比较简单,当WebSocket连接建立起来时后端服务器会收到来自前端的请求,将消息广播给所有与服务器连接的客户端,每个连接客户端都会收到消息。

实例2:实时数据更新

在Web开发中,常用的的实时数据更新方案是轮询,但轮询的效果并不理想。这时可以用WebSocket实现实时数据更新。

1. 客户端

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>WebSocket Demo</title>
</head>
<body>
    <p id="data"></p>
    <script>
        const socket = new WebSocket('ws://localhost:3002');
        socket.addEventListener('message', function (event) {
          const data = JSON.parse(event.data);
          document.getElementById('data').innerHTML = data.temperature;
        }); 
    </script>
</body>
</html>

客户端会每隔一段时间向服务器发送请求,在数据更新的时候,服务器会向客户端发起推送。

2. 服务器端

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 3002 });

wss.on('connection', function connection(ws) {
  console.log('WebSocket connection established.');

  setInterval(function () {
    const data = {
      temperature: Math.round(Math.random() * 50 + 273)
    };
    ws.send(JSON.stringify(data));
  }, 1000);
});

这里使用setInterval模拟实时更新,并使用JSON格式发送数据。

总结

通过本文的介绍,我们了解到了WebSocket的实现流程以及使用Node.js实现WebSocket的方法。WebSocket非常适合实现需要实时数据推送的Web应用,例如聊天室、实时数据更新等,使用起来非常方便。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析nodejs实现Websocket的数据接收与发送 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 浅谈Nodejs中的作用域问题

    浅谈Node.js中的作用域问题 作用域是编程中一个非常重要的概念,它定义了变量和函数的可访问性。Node.js在处理作用域问题时也有自己的特点。 作用域 在Node.js中,作用域分为全局作用域和函数作用域两种。 全局作用域中定义的变量可以在整个程序中被访问到,例如: var a = 10; function test() { console.log(a)…

    node js 2023年6月8日
    00
  • node.js实现回调的方法示例

    下面我将详细讲解“node.js实现回调的方法示例”的完整攻略,包含以下内容: 什么是回调函数 Node.js中实现回调的两种方式 示例一:使用普通回调函数实现异步流程控制 示例二:使用Promise对象实现异步流程控制 1. 什么是回调函数 回调函数是指将一个函数作为参数传递给另一个函数,并且这个参数函数将在另一个函数完成后被调用执行的过程。回调函数是实现…

    node js 2023年6月8日
    00
  • autojs的nodejs打包成品app经验分享

    下面我将为您详细讲解”autojs的nodejs打包成品app经验分享”的完整攻略,包含以下过程: 步骤一:准备工作 在开始打包前,我们需要先安装一下软件: 安装AutoJs Pro版和JDK AutoJs Pro版手机端软件下载地址:AutoJs Pro下载。 JDK下载地址:JDK下载。 安装nodejs和npm nodejs下载地址:nodejs下载 …

    node js 2023年6月8日
    00
  • JavaScript ES6中类与模块化管理超详细讲解

    JavaScript ES6中类与模块化管理超详细讲解 什么是ES6中的类 在ES6之前,我们用函数来模拟类,从而实现面向对象编程。但是这种方式并不直观,并且容易出错。在ES6中,我们可以通过关键字class来定义类,这样就更加符合面向对象编程的直观性。 如何定义一个类 使用关键字class可以定义一个类,其中类名的首字母通常大写(和Java等其他面向对象编…

    node js 2023年6月8日
    00
  • node.js 利用流实现读写同步,边读边写的方法

    当我们需要读取大量数据并将其写入其他地方时,使用基于流的方法会更加高效和节省内存。下面是一些利用Node.js流实现读写同步,边读边写的方法: 创建读写流 首先,我们需要创建一个可读流和一个可写流。可以使用内置的fs模块读取文件内容并使用可写流写入流输出。 const fs = require(‘fs’); const readable = fs.creat…

    node js 2023年6月8日
    00
  • node+express+ejs使用模版引擎做的一个示例demo

    下面是详细讲解“node+express+ejs使用模版引擎做的一个示例demo”的完整攻略。 什么是Node.js Node.js是一个基于Chrome V8 JavaScript引擎的开源、跨平台的JavaScript运行环境。它可以使JavaScript在服务器端运行,用于构建快速的网络应用程序。 什么是Express Express是一个基于Node…

    node js 2023年6月8日
    00
  • 深入理解Node.js中通用基础设计模式

    深入理解Node.js中通用基础设计模式 Node.js作为一款JavaScript运行时环境,其快速高效的特性促使其被广泛应用于Web应用、网络应用和IoT设备控制等场景中。本攻略旨在深入探讨Node.js的通用基础设计模式,以帮助开发者更好地理解和应用Node.js。 1. 单例模式 单例模式是一种常见的设计模式,其主要思想是保证某个类只有一个实例化对象…

    node js 2023年6月8日
    00
  • Node.js模拟发起http请求从异步转同步的5种用法

    Node.js是一个非常流行的服务器端JavaScript运行环境,可以通过其内置的HTTP模块发起HTTP请求,但这些请求通常是异步的。如果需要将它们转换为同步请求,可以使用以下五种方法: 1. 使用Promise Promise是一种用于处理异步操作的设计模式。可以将异步请求包裹在Promise中,并在then和catch块中处理请求响应和错误。下面是一…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部