当前位置: 首页 > article >正文

nodejs创建ws服务器,前端浏览器用websocket接收信息和发送信息给服务端

首页是用nodejs建立服务器端
//wsserver.js

const WebSocket=require('ws');
const wss=new WebSocket.Server({port:8080});
wss.on('connection',function connection(ws){
    ws.on('error',console.error);
    //接收客户端发送过来的信息
    ws.on('message',function message(data){
        console.log('received:%s',data);
    });
    //向服务端发送信息
    ws.send('你好啊客户端');
})

//创建前端的websocket文件
websocketclient.js

class WebSocketClient {
	//私有成员url和socket变量
    #privateUrl = '';
    #privateSocket = null;
    #messageQueue = []; // 消息队列,用于存储在连接打开前的消息

    constructor(url) {
        this.#privateUrl = url;
        //创建websocket对象,url就是服务器地址:ws://localhost:8080
        this.#privateSocket = new WebSocket(this.#privateUrl);
        //建立连接函数
        this.#setupWebSocketEvents();
    }

    #setupWebSocketEvents() {
        this.#privateSocket.onopen = () => {
            console.log(`连接成功,等待服务端数据推送[onopen]...`);
            // 连接打开后,发送队列中的消息
            this.#messageQueue.forEach(msg => this.#privateSocket.send(msg));
            this.#messageQueue = []; // 清空消息队列
        };
        //下面三个必须用箭头函数才能反应上下文关系
        this.#privateSocket.onmessage = (event) => {
            console.log('服务端发送来的数据%s', event.data);
        };
        this.#privateSocket.onclose = () => {
            console.log('连接已断开[onclose]...');
        };
        this.#privateSocket.onerror = (event) => {
            console.log('连接异常[onerror]');
        };
    }

//这里客户端发送信息,如果是已经连接状态则直接发送信息,如果未打开连接或连接中,则把信息添加到队列中
    sendWhenConnected(message) {
        if (this.#privateSocket && this.#privateSocket.readyState === WebSocket.OPEN) {
            this.#privateSocket.send(message);
        } else {
            // 如果WebSocket尚未打开连接,则将消息添加到队列
            this.#messageQueue.push(message);
        }
    }

    
//关闭连接
    close() {
        if (this.#privateSocket) {
            this.#privateSocket.close();
            this.#privateSocket = null;
        }
    }
}
//导出WebSocketClient类
export default WebSocketClient;

//html文件,index.html

<html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
        <title>测试websocket</title>
    </head>
    <body>
        
    </body>
    <script type="module">
    //导入类
        import WebSocketClient from './websocketclient.js';
        //创建对象连接
        let a=new WebSocketClient('ws://localhost:8080');
        //向服务端发送信息
        a.sendWhenConnected('你好啊服务端');
        
        
    </script>
</html>

最后结果为这样
在这里插入图片描述


http://www.kler.cn/a/450195.html

相关文章:

  • C++ Learning string类的使用
  • Vue3中路由跳转之后删除携带的query参数
  • 智能座舱进阶-应用框架层-Jetpack主要组件
  • 记录一个SVR学习
  • “AI 线索精益模型调用系统:开启精准营销新引擎
  • Retrofit源码分析:动态代理获取Api接口实例,解析注解生成request,线程切换
  • LeetCode 206. 反转链表 (C++实现)
  • Yolo11改进策略:Block改进|使用FastVit的RepMixerBlock改进Yolo11,重参数重构助力Yolo11涨点(全网首发)
  • 系统思考—全局思维
  • 深度学习-77-大模型量化之Post Training Quantization训练后量化PTQ
  • 嵌入式硬件产品:CC254x 蓝牙升级
  • 机器学习之 KNN 算法
  • Axios 取消上一次重复请求
  • DELL EMC Unity 存储系统扩容之如何查看pool类型
  • Java 异常
  • Next.js 14 数据处理:从服务端组件到状态管理的最佳实践
  • Vue.js前端框架教程11:Vue监听器watch和watchEffect
  • MATLAB直接推导函数的导函数和积分形式(具体方法和用例)
  • JAVA开发 在 Spring Boot 中集成 Swagger
  • 人的心理特征
  • PMO转型提升汽车销售效率:看板工具的关键作用
  • 关于 K8s 的一些基础概念整理-补充【k8s系列之二】
  • 石岩基督教福音堂
  • 【CryptoJS库AES加密】
  • 蓝牙协议——音乐启停控制
  • sward - 一款国产开源免费的企业级知识库管理工具