zoukankan      html  css  js  c++  java
  • node.js使用vue-native-websocket实现websocket通信 实测有效

    Vue2、websocket 与node.js接口 本地测试

    1.  安装vue-native-websocket模块
    2.  yarn add vue-native-websocket 
    或者用 
    npm install vue-native-websocket --save
     

    3. 在main.js中引入websocket

     

    项目中main.js使用如下图

     

    封装websocket的api

    参考https://blog.csdn.net/m0_38134431/article/details/105794108

    自己封装的
    let ws = null
    let messageCallback = null //ws返回成功的回调函数
    let setIntervalWS = null

    // 初始化websocket
    function initWebSocket(url) {
    if (!ws) {
    ws = new WebSocket(url)
    ws.onmessage = function (e) {
    websocketOnmessage(e)
    }
    ws.onopen = function () {
    websocketOpen()
    }
    ws.onclose = function (e) {
    websocketClose(e)
    }
    ws.onerror = function () {
    websocketError()
    }
    }
    }

    // 发送数据
    function websocketSend(agentData) {
    // 添加状态判断
    //OPEN时,发送消息
    if (ws.readyState === ws.OPEN) {
    setIntervalWS = setInterval(() => {
    ws.send(JSON.stringify(agentData)) // 发给后端的数据需要字符串化
    }, 1000)
    //CLOSED时,尝试重连,重连成功,继续发送消息
    } else if (ws.readyState === ws.CLOSED) {
    retry()
    //重连成功,则继续发送
    if (ws.readyState === ws.OPEN) {
    setIntervalWS = setInterval(() => {
    ws.send(JSON.stringify(agentData)) // 发给后端的数据需要字符串化
    }, 1000)
    }
    }
    }

    // 返回数据
    function websocketOnmessage(e) {
    messageCallback(JSON.parse(e.data))

    }

    // 建立连接
    function websocketOpen(e) {
    console.log('ws连接建立')
    }


    // 连接失败
    function websocketError() {
    console.log('ws连接失败,尝试重连')
    clearInterval(setIntervalWS)
    ws.close()
    initWebSocket(url)
    }

    // 关闭连接
    function websocketClose(e) {
    clearInterval(setIntervalWS)
    ws.close()
    ws = null
    }

    // 重连函数
    function retry() {
    let maxRetry = 5;
    if (maxRetry == 0 || ws != null) {
    clearInterval(setIntervalWS)
    return false
    }
    //每3秒一次重连,最多5次
    setIntervalWS = setInterval(() => {
    ws.onerror()
    }, 3000)
    }

    /**
    * 发起websocket请求函数
    * @param {type} 0为心跳,1为单次 发送数据的模式
    * @param {string} url ws连接地址
    * @param {Object} agentData 传给后台的参数
    * @param {function} successCallback 接收到ws数据,对数据进行处理的回调函数
    */
    export function sendWebsocketPing(type, url, agentData, successCallback) {
    initWebSocket(url)
    messageCallback = successCallback
    switch (type) {
    case 0:
    websocketSend(agentData)
    break;
    case 1:
    ws.send(agentData)
    break;
    default:
    break;
    }
    }

    /**
    * 关闭websocket函数
    */
    export function closeWebsocket() {
    if (ws) {
    ws.onclose() // 关闭websocket
    console.log('ws连接关闭')
    }

    }
    新建server.js文件,用于写node.js接口,
    安装nodejs-websocket模块npm install websocket 用cmd或者git bash进入项目目录,然后命令行输入node server.js,启动后台服务。文件如下:
    var WebSocketServer = require('websocket').server;

    var http = require('http');

    var json = require('./myTest')

    var str1 = "{"action": "stat.nodes", "time": 1590035916, "data": {"nodes": [{"fd": 19, "ip": "192.168.10.11", "port": 55296, "allow": true, "down": false, "nodeName": "itv-auth-node-138121", "mainPort": 8088, "group": "hot", "targetUrl": "http://auth.liaowo.test", "version": "dev - 0", "runtime": "php: 7.3.18-1+ubuntu18.04.1+deb.sury.org+1, swoole: 4.5.1", "weights": 0.0221}, {"fd": 233, "ip": "角卷绵芽", "port": 520, "allow": true, "down": false, "nodeName": "咚咚咚", "mainPort": 520, "group": "hot", "targetUrl": "不是我的错吧", "version": "dev - 0", "runtime": "php: 7.3.18-1+ubuntu18.04.1+deb.sury.org+1, swoole: 4.5.1", "weights": 0.0221}], "dispatch_weights": [{"fd": 19, "weight": 9997}], "dispatch_count": []}}";
    var str2 = "{"action":"stat.server","time":1590045218,"data":{"info":{"name":"itv-auth-lb-138122","version":"dev","build_date":"0","runtime_info":"php: 7.3.14-6+ubuntu16.04.1+deb.sury.org+1, swoole: 4.4.18"},"stat":{"server":{"start_time":1590045183,"connection_num":2,"accept_count":3,"close_count":1,"worker_num":2,"idle_worker_num":1,"tasking_num":0,"request_count":31,"worker_request_count":1,"worker_dispatch_count":0,"coroutine_num":2},"worker":[{"event_num":8,"signal_listener_num":0,"aio_task_num":0,"aio_worker_num":2,"c_stack_size":2097152,"coroutine_num":2,"coroutine_peak_num":2,"coroutine_last_cid":191,"pid":5197,"timer":2,"mem_usage":3895688,"mem_peak_usage":3960464,"stat_redis":{"consumer_num":0,"producer_num":0,"queue_num":0,"create":0,"max":4,"min":0},"http_pool":null},{"event_num":6,"signal_listener_num":1,"aio_task_num":0,"aio_worker_num":2,"c_stack_size":2097152,"coroutine_num":4,"coroutine_peak_num":5,"coroutine_last_cid":166,"pid":5194,"timer":6,"mem_usage":3997240,"mem_peak_usage":4067208,"stat_redis":{"consumer_num":0,"producer_num":0,"queue_num":1,"create":1,"max":4,"min":0},"http_pool":null},{"event_num":8,"signal_listener_num":0,"aio_task_num":0,"aio_worker_num":2,"c_stack_size":2097152,"coroutine_num":4,"coroutine_peak_num":4,"coroutine_last_cid":292,"pid":5196,"timer":4,"mem_usage":5784680,"mem_peak_usage":6049248,"stat_redis":{"consumer_num":0,"producer_num":0,"queue_num":0,"create":0,"max":4,"min":0},"http_pool":null}],"auth":{"accept":{"count":0,"qps":0,"qps_peak":0},"refuse":{"count":0,"qps":0,"qps_peak":0},"accept_m3u8":{"count":0,"qps":0,"qps_peak":0},"accept_ts":{"count":0,"qps":0,"qps_peak":0},"upstream_err":{"count":0,"qps":0,"qps_peak":0},"not_found":{"count":0,"qps":0,"qps_peak":0},"other_err":{"count":0,"qps":0,"qps_peak":0},"expired":{"count":0,"qps":0,"qps_peak":0},"invalid_sign":{"count":0,"qps":0,"qps_peak":0},"bad_ip":{"count":0,"qps":0,"qps_peak":0},"bad_self":{"count":0,"qps":0,"qps_peak":0},"bad_sess":{"count":0,"qps":0,"qps_peak":0},"bad_sign":{"count":0,"qps":0,"qps_peak":0},"secret_url":{"count":0,"qps":0,"qps_peak":0},"redis_err":{"count":0,"qps":0,"qps_peak":0}},"os":{"network":{"enp0s8":{"rx_bytes":7479.24,"tx_bytes":19874.42,"load_up":0.03,"load_down":0.01,"load":0.02,"load_wa":0.02},"enp0s3":{"rx_bytes":0,"tx_bytes":0,"load_up":0,"load_down":0,"load":0,"load_wa":0},"enp0s9":{"rx_bytes":2414.68,"tx_bytes":182.16,"load_up":0,"load_down":0,"load":0,"load_wa":0}},"disk":{"sdb":{"tps":0,"rkByteSec":0,"wkByteSec":0,"avgquSz":0,"r_await":0,"w_await":0,"await":0,"util":0,"util_wa":0,"load_read":0,"load_write":0,"load":0,"load_wa":0},"sda":{"tps":0,"rkByteSec":0,"wkByteSec":0,"avgquSz":0,"r_await":0,"w_await":0,"await":0,"util":0,"util_wa":0,"load_read":0,"load_write":0,"load":0,"load_wa":0},"sda1":{"tps":0,"rkByteSec":0,"wkByteSec":0,"avgquSz":0,"r_await":0,"w_await":0,"await":0,"util":0,"util_wa":0,"load_read":0,"load_write":0,"load":0,"load_wa":0}}}}}}";

    var server = http.createServer(function(request, response) {

    console.log((new Date()) + ' Received request for ' + request.url);

    response.writeHead(404);

    response.end();

    });

    server.listen(8080, function() {

    console.log((new Date()) + ' 已经连接上8080');

    });



    wsServer = new WebSocketServer({

    httpServer: server,



    });





    wsServer.on('request', function(request) {

    //当前的连接

    var connection = request.accept(null, request.origin);



    // setInterval(function(){
    //
    // connection.sendUTF(json)
    //
    // },500)



    console.log((new Date()) + '已经建立连接');

    connection.on('message', function(message) {

    if (message.type === 'utf8') {

    console.log('Received Message: ' + message.utf8Data);

    //connection.sendUTF(str1);
    connection.sendUTF(str1)

    }

    else if (message.type === 'binary') {

    console.log('Received Binary Message of ' + message.binaryData.length + ' bytes');

    }

    });

    connection.on('close', function(reasonCode, description) {

    console.log((new Date()) + ' Peer ' + connection.remoteAddress + '断开连接');

    });

    });  

    最后记得main.js的钩子函数中,实例化websocket

    const ws = this.$websocket
    ws.createSocket()
    若要发送数据
    ws.sendWSPush('数据')
    var WebSocketServer = require('websocket').server;

    var http = require('http');

    var json = require('./myTest')

    var str1 = "{"action": "stat.nodes", "time": 1590035916, "data": {"nodes": [{"fd": 19, "ip": "192.168.10.11", "port": 55296, "allow": true, "down": false, "nodeName": "itv-auth-node-138121", "mainPort": 8088, "group": "hot", "targetUrl": "http://auth.liaowo.test", "version": "dev - 0", "runtime": "php: 7.3.18-1+ubuntu18.04.1+deb.sury.org+1, swoole: 4.5.1", "weights": 0.0221}, {"fd": 233, "ip": "角卷绵芽", "port": 520, "allow": true, "down": false, "nodeName": "咚咚咚", "mainPort": 520, "group": "hot", "targetUrl": "不是我的错吧", "version": "dev - 0", "runtime": "php: 7.3.18-1+ubuntu18.04.1+deb.sury.org+1, swoole: 4.5.1", "weights": 0.0221}], "dispatch_weights": [{"fd": 19, "weight": 9997}], "dispatch_count": []}}";
    var str2 = "{"action":"stat.server","time":1590045218,"data":{"info":{"name":"itv-auth-lb-138122","version":"dev","build_date":"0","runtime_info":"php: 7.3.14-6+ubuntu16.04.1+deb.sury.org+1, swoole: 4.4.18"},"stat":{"server":{"start_time":1590045183,"connection_num":2,"accept_count":3,"close_count":1,"worker_num":2,"idle_worker_num":1,"tasking_num":0,"request_count":31,"worker_request_count":1,"worker_dispatch_count":0,"coroutine_num":2},"worker":[{"event_num":8,"signal_listener_num":0,"aio_task_num":0,"aio_worker_num":2,"c_stack_size":2097152,"coroutine_num":2,"coroutine_peak_num":2,"coroutine_last_cid":191,"pid":5197,"timer":2,"mem_usage":3895688,"mem_peak_usage":3960464,"stat_redis":{"consumer_num":0,"producer_num":0,"queue_num":0,"create":0,"max":4,"min":0},"http_pool":null},{"event_num":6,"signal_listener_num":1,"aio_task_num":0,"aio_worker_num":2,"c_stack_size":2097152,"coroutine_num":4,"coroutine_peak_num":5,"coroutine_last_cid":166,"pid":5194,"timer":6,"mem_usage":3997240,"mem_peak_usage":4067208,"stat_redis":{"consumer_num":0,"producer_num":0,"queue_num":1,"create":1,"max":4,"min":0},"http_pool":null},{"event_num":8,"signal_listener_num":0,"aio_task_num":0,"aio_worker_num":2,"c_stack_size":2097152,"coroutine_num":4,"coroutine_peak_num":4,"coroutine_last_cid":292,"pid":5196,"timer":4,"mem_usage":5784680,"mem_peak_usage":6049248,"stat_redis":{"consumer_num":0,"producer_num":0,"queue_num":0,"create":0,"max":4,"min":0},"http_pool":null}],"auth":{"accept":{"count":0,"qps":0,"qps_peak":0},"refuse":{"count":0,"qps":0,"qps_peak":0},"accept_m3u8":{"count":0,"qps":0,"qps_peak":0},"accept_ts":{"count":0,"qps":0,"qps_peak":0},"upstream_err":{"count":0,"qps":0,"qps_peak":0},"not_found":{"count":0,"qps":0,"qps_peak":0},"other_err":{"count":0,"qps":0,"qps_peak":0},"expired":{"count":0,"qps":0,"qps_peak":0},"invalid_sign":{"count":0,"qps":0,"qps_peak":0},"bad_ip":{"count":0,"qps":0,"qps_peak":0},"bad_self":{"count":0,"qps":0,"qps_peak":0},"bad_sess":{"count":0,"qps":0,"qps_peak":0},"bad_sign":{"count":0,"qps":0,"qps_peak":0},"secret_url":{"count":0,"qps":0,"qps_peak":0},"redis_err":{"count":0,"qps":0,"qps_peak":0}},"os":{"network":{"enp0s8":{"rx_bytes":7479.24,"tx_bytes":19874.42,"load_up":0.03,"load_down":0.01,"load":0.02,"load_wa":0.02},"enp0s3":{"rx_bytes":0,"tx_bytes":0,"load_up":0,"load_down":0,"load":0,"load_wa":0},"enp0s9":{"rx_bytes":2414.68,"tx_bytes":182.16,"load_up":0,"load_down":0,"load":0,"load_wa":0}},"disk":{"sdb":{"tps":0,"rkByteSec":0,"wkByteSec":0,"avgquSz":0,"r_await":0,"w_await":0,"await":0,"util":0,"util_wa":0,"load_read":0,"load_write":0,"load":0,"load_wa":0},"sda":{"tps":0,"rkByteSec":0,"wkByteSec":0,"avgquSz":0,"r_await":0,"w_await":0,"await":0,"util":0,"util_wa":0,"load_read":0,"load_write":0,"load":0,"load_wa":0},"sda1":{"tps":0,"rkByteSec":0,"wkByteSec":0,"avgquSz":0,"r_await":0,"w_await":0,"await":0,"util":0,"util_wa":0,"load_read":0,"load_write":0,"load":0,"load_wa":0}}}}}}";

    var server = http.createServer(function(request, response) {

    console.log((new Date()) + ' Received request for ' + request.url);

    response.writeHead(404);

    response.end();

    });

    server.listen(8080, function() {

    console.log((new Date()) + ' 已经连接上8080');

    });



    wsServer = new WebSocketServer({

    httpServer: server,



    });





    wsServer.on('request', function(request) {

    //当前的连接

    var connection = request.accept(null, request.origin);



    // setInterval(function(){
    //
    // connection.sendUTF(json)
    //
    // },500)



    console.log((new Date()) + '已经建立连接');

    connection.on('message', function(message) {

    if (message.type === 'utf8') {

    console.log('Received Message: ' + message.utf8Data);

    //connection.sendUTF(str1);
    connection.sendUTF(str1)

    }

    else if (message.type === 'binary') {

    console.log('Received Binary Message of ' + message.binaryData.length + ' bytes');

    }

    });

    connection.on('close', function(reasonCode, description) {

    console.log((new Date()) + ' Peer ' + connection.remoteAddress + '断开连接');

    });

    });
  • 相关阅读:
    去除字符串中的重复字符
    .net生成的类,跨工程调用显示注释
    Flex 页面空白或Error #2032: 流错误处理办法
    读取点阵字库
    SQL多表联合查询(Access数据库表)
    MSComm不能触发MSComm1_OnComm()事件原因之一
    一个小时内学习SQLite数据库(转)
    人生无悔
    学习之道
    挺经
  • 原文地址:https://www.cnblogs.com/water-no-moon/p/12887113.html
Copyright © 2011-2022 走看看