首页 > 编程语言 >使用js和nodejs完成websocket双向通讯

使用js和nodejs完成websocket双向通讯

时间:2023-12-16 23:22:48浏览次数:36  
标签:WebSocket log nodejs console js ws websocket message 客户端

如题。感谢AI。

先用js完成一个最简单的例子。

web端:

html:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="j1.js"></script>
    </head>
    <body onl oad="myinit()">
        内容:<input  type="text" id="t1"/>
        <input type="button" value="执行" onclick="f1();"/>
    </body>
</html>

j1.js: 

let socket;
function myinit()
{
    // 创建 WebSocket 连接
    socket = new WebSocket('ws://127.0.0.1:8080');
    
    // 当连接建立时触发
    socket.onopen = () => {
      console.log('连接已建立');
      
      // 发送文本消息
      socket.send('hi');
    };
    
    // 当接收到服务器消息时触发
    socket.onmessage = (event) => {
      console.log('接收到服务器消息:', event.data);
    };
    
    // 当连接关闭时触发
    socket.onclose = () => {
      console.log('连接已关闭');
    };
    
    // 当连接发生错误时触发
    socket.onerror = (error) => {
      console.error('WebSocket 错误:', error);
    };
}

function f1()
{
    t1=document.querySelector("#t1");
    tosend=t1.value;
    socket.send(tosend);
}

代码很简单,略。

 


 

服务端

使用的是websocket,需要先安装websocket插件“ws”。

App.js代码:

const WebSocket = require('ws');

// 创建 WebSocket 服务器
const wss = new WebSocket.Server({ port: 8080 });

// 监听连接事件
wss.on('connection', (ws) => {
  console.log('客户端已连接');

  // 监听消息事件
  ws.on('message', (message) => {
    disp=message.toString();
    console.log('接收到消息:', disp);

    // 在消息后面添加 "Hi from server"
    const response = message + ' Hi from server';

    // 发送回客户端
    ws.send(response);
  });

  // 监听关闭事件
  ws.on('close', () => {
    console.log('客户端已断开连接');
  });
});

console.log('WebSocket 服务器已启动');

注意:消息默认以二进制发送,服务端想要解析消息内容,需要toString。

运行结果正常。 


 

想要维护一个客户列表,向客户广播消息,服务端代码修改为:

 1 const WebSocket = require('ws');
 2 
 3 // 创建 WebSocket 服务器
 4 const wss = new WebSocket.Server({ port: 8080 });
 5 
 6 // 用于存储已连接的客户端
 7 //clients不可再分配空间,但里面的值可以修改。
 8 const clients = new Set();
 9 
10 // 监听连接事件
11 wss.on('connection', (ws) => {
12   console.log('客户端已连接');
13 
14   // 将新连接的客户端添加到列表中
15   clients.add(ws);
16 
17   // 监听消息事件
18   ws.on('message', (message) => {
19     console.log('接收到消息:', message.toString());
20     broadcastMessage("server:"+message);
21   });
22 
23   // 监听关闭事件
24   ws.on('close', () => {
25     console.log('客户端已断开连接');
26     // 从列表中移除断开连接的客户端
27     clients.delete(ws);
28   });
29 });
30 
31 // 定义向所有客户端发送消息的函数
32 function broadcastMessage(message) {
33   clients.forEach((client) => {
34     // 发送消息给每个客户端
35     client.send(message);
36   });
37 }
38 
39 // 启动定时器,每隔一段时间向所有客户端发送消息
40 // setInterval(() => {
41 //   broadcastMessage('hi');
42 // }, 5000);
43 
44 console.log('WebSocket 服务器已启动');

测试通过。 


小结:js不愧是最简单的东西。

 

标签:WebSocket,log,nodejs,console,js,ws,websocket,message,客户端
From: https://www.cnblogs.com/wanjinliu/p/17898723.html

相关文章

  • 使用JS脚本修改页面内容
    在学习RPA时,我对使用JS脚本修改页面内容进行了深入学习。记录如下:获取元素的方法:1.document.getElementById("xxx")2.document.getElementsByClassName("xxx")3.document.getElementsByTagName("xxx")4.document.getElementsByName("xxx")5.document.querySele......
  • 第三章:SpringBoot集成jsp、mybatis的逆向工程和集成
    一、springboot继承jsp二、mybatis逆向工程三、集成mybatis四、案例-集成mybatis五、集成mybatis总结......
  • vue3+vite+js中二次封装axios
    一、安装axiosnpmiaxios二、文件结构涉及到的文件:utils/request.sjapi/index.js(可以根据不同页面在api文件下新建不同文件夹,方便管理)vite.config.js三、request.js对axios进行简单的二次封装importaxiosfrom"axios";constrequest=axios.create({//......
  • Nestjs的Provider 和依赖注入
    前言上文介绍了如何理解依赖注入和控制反转,简单来说,控制反转是一种设计模式,可以将类与类的关系解耦,将人工维护转移给一个容器维护。要实现控制反转,依赖注入是一个常用方案,将依赖注册到DI容器中,哪里用到,就让容器将实例注入到哪里。Nest中的依赖注入,主要就是围绕提供者(Provider)展......
  • [JS] JS单例模式的实现
    JS单例模式的实现单例模式简介单例模式(SingletonPattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,提供了一种创建对象的最佳方式。特点:意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。何时使用:当......
  • tsconfig.json文件配置
    tsconfig.json配置TypeScript使用tsconfig.json文件作为其配置文件,当一个目录中存在tsconfig.json文件,则认为该目录为TypeScript项目的根目录。基础字段files-设置要编译的文件的名称;['./src/main.tsx']include-设置需要进行编译的文件,支持路径模式匹配;['src']......
  • nodejs使用sequelize vscode报错:Type 'Model<any, any, any>' is not a constructor f
    我的模型定义如下:import{Model,DataTypes}from"sequelize";//定义资源模型classRuleextendsModel{}问题:vscdoe报错:Type'Model<any,any,any>'isnotaconstructorfunctiontype.解决:这个问题可能是由于TypeScript类型定义的问题导致的。Model 是Seq......
  • 电脑时间不同步导致的上网报错:core/proxy/vmess/encoding: failed to read response h
    报错内容: 2023/12/1614:08:56[Warning][775541588]xxxxx.com/core/app/proxyman/outbound:failedtoprocessoutboundtraffic>xxxxx.com/core/proxy/vmess/outbound:connectionends>xxxxx.com/core/proxy/vmess/outbound:failedtoreadheader>xxxx......
  • 【前端开发】Next.js VS Nest.js–Nest和Next之间的区别
    web开发框架起到支持作用,并提供了开发应用程序的有效方法。它具有不同的功能和特性,这使得开发过程更容易,开发人员总是能找到最快的编码方式。这就是为什么,无论是后端还是前端框架,大多数开发人员都喜欢使用它。一些框架通常具有非凡的功能,可以最大限度地减少代码,使应用程序开发更快......
  • Java: OpenWeatherMap json Deserialization of Java Objects
    openweathermap.json{"coord":{"lon":114.0683,"lat":22.5455},"weather":[{"id":803,"main":"Clouds","description":"多云",......