Node构建WebSocket服务

1,WebSocket和Http的区别?

HTTP只能由客户端发起通信,不能主动获取实时数据。常用的方法轮询,就是用一个定时器,不停地发http请求(非常浪费资源)。

我们希望的场景是这样的:服务端数据发生变化,主动向客户端推送最新信息,客户端也可以主动向服务器发送信息。这个时候

服务器推送技术WebSocket就出场了。

2,WebSocket 客户端提供的使用方法

//1,WebSocket 实例化
var ws = new WebSocket("ws://localhost:8181");
    ws.onopen = function (e) {
        console.log(‘客户端(client):与服务器的连接已打开‘)
  }
2,readyState属性返回实例对象的当前状态

//CONNECTING:值为0,表示正在连接。
//OPEN:值为1,表示连接成功,可以通信了。
//CLOSING:值为2,表示连接正在关闭。
//CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
3,webSocket.onopen //指定连接成功后的回调函数
4,webSocket.onclose //指定连接关闭后的回调函数
5,webSocket.onmessage //收到服务器数据后的回调函数
6,webSocket.send //方法用于向服务器发送数据
7,webSocket.bufferedAmount //表示还有多少字节的二进制数据没有发送出去。它可以用来判断发送是否结束。
8,webSocket.onerror //指定报错时的回调函数。

ws.onopen = function () {
  ws.send(‘连接服务器成功‘);
}

//多个回调函数用
ws.addEventListener(‘open‘, function (event) {
  ws.send(‘Hello Server!‘);
});

3,WebSocket 服务端实现

不用全看,文档不是很全,技术是实现业务方法

我简单写了几个demo

3.1客户端向服务端发送消息

安装node,和ws

npm install ws

新建文件

客户端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link href="../bootstrap-3.3.5/css/bootstrap.min.css" rel="stylesheet" />
    <script src="../js/jquery-1.12.3.min.js"></script>
    <script src="../bootstrap-3.3.5/js/bootstrap.min.js"></script>
</head>

<body>

    <div class="vertical-center">
        <div class="container">
            <!-- 客户端加一个简单的input输入框和一个发送按钮 -->
            <form role="form" id="chat_form" onsubmit="sendMessage(); return false;" style="margin-top:100px;">
                <div class="form-group">
                    <input class="form-control" type="text" name="message" id="message" value="" />
                </div>
                <button type="button" id="send" class="btn btn-primary" onclick="sendMessage();">
                    发送
                </button>
            </form>
        </div>
    </div>
</body>
<script>
    //WebSocket实例化
    var ws = new WebSocket("ws://localhost:8181");
    ws.onopen = function (e) {
        //成功连接服务器回调
        console.log(‘客户端(client):与服务器的连接已打开‘)
    }

    function sendMessage() {
        ws.send($(‘#message‘).val());
    };
</script>

</html>

服务端代码

var WebSocketServer = require(‘ws‘).Server,
wss = new WebSocketServer({ port: 8181 });//服务端口8181
wss.on(‘connection‘, function (ws) {
    console.log(‘服务端:客户端已连接‘);
    ws.on(‘message‘, function (message) {
        //打印客户端监听的消息
        console.log(message);
    });
});

启动node服务

3.2服务端图推送消息到客户端

场景:车辆速度实时讲课监控。每三秒客户端更新一次信息

同样客户端代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>服务器推送消息</title>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link href="../bootstrap-3.3.5/css/bootstrap.min.css" rel="stylesheet" />
    <script src="../js/jquery-1.12.3.min.js"></script>
    <script src="../bootstrap-3.3.5/js/bootstrap.min.js"></script>
</head>

<body>
    <div class="vertical-center">
        <div class="container">
            <h1>检测车辆速度</h1>
            <button class="btn btn-primary">开始</button>
            <button class="btn btn-danger">停止</button>
            <table class="table" id="stockTable">
                <thead>
                    <tr>
                        <th>车牌号</th>
                        <th>速度</th>
                    </tr>
                </thead>
                <tbody id="stockRows">
                    <tr>
                        <td>
                            <h3>A11111</h3>
                        </td>
                        <td id="A11111">
                            <h3><span class="label label-default label-success">00.00</span></h3>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <h3>A22222</h3>
                        </td>
                        <td id="A22222">
                            <h3><span class="label label-default label-success">00.00</span></h3>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>
    <script>
        var ws = new WebSocket("ws://localhost:8181");
        var stock_request = {
            "speed": ["A11111", "A22222"]
        };
        var isClose = false;
        var speed = {
            "A11111": 0,
            "A22222": 0,
        };
        //更新视图
        function updataSource() {
            ws.onopen = function (e) {
                console.log(‘连接服务器成功‘);
                isClose = false;
                ws.send(JSON.stringify(stock_request));
                console.log("发送消息成功");
            }
            // UI update function
            var changeSpeedEntry = function (item, newValue) {
                var valElem = $(‘#‘ + item + ‘ span‘);
                valElem.html(newValue.toFixed(2));
            }
            // 客户端WebSocket 监听消息并处理程序
            ws.onmessage = function (e) {
                var speedData = JSON.parse(e.data);
                console.log("收到数据:" + speedData);
                for (var item in speedData) {
                    if (speedData.hasOwnProperty(item)) {
                        changeSpeedEntry(item, speedData[item]);
                        speed[item] = speedData[item];
                    }
                }
            };
        }

        //业务代码
        updataSource();

        $(".btn-primary").click(function () {
            if (isClose) {
                ws = new WebSocket("ws://localhost:8181");
            }
            updataSource();
        });
        $(".btn-danger").click(function () {
            ws.close();
        });

        ws.onclose = function (e) {
            console.log("断开连接", e);
            isClose = true;
        };
    </script>
</body>

</html>

服务端代码

var WebSocketServer = require(‘ws‘).Server,
    wss = new WebSocketServer({
        port: 8181
    }); //服务端口8181
var speed = {
    "A11111": 95.0,
    "A22222": 50.0
}

var randomSpeedUpdater = function () {
    for (var item in speed) {

        var randomizedChange = Math.random(60, 120);
        speed[item] += randomizedChange;

    }
}
//模拟车速实时变化

setInterval(
    function () {
        randomSpeedUpdater();
    }, 1000)

var clientSpeeds = [];
wss.on(‘connection‘, function (ws) {
    var sendSpeedUpdates = function (ws) {
        if (ws.readyState == 1) {
            var speedObj = {};
            for (var i = 0; i < clientSpeeds.length; i++) {
                var item = clientSpeeds[i];
                speedObj[item] = speed[item];
            }
            if (speedObj.length !== 0) {
                ws.send(JSON.stringify(speedObj)); //需要将对象转成字符串。WebSocket只支持文本和二进制数据,推送消息
                console.log("服务器:更新数据", JSON.stringify(speedObj));
            }

        }
    }

    //每三秒发送一次
    var clientSpeedUpdater = setInterval(function () {
        sendSpeedUpdates(ws);
    }, 3000);
    ws.on(‘message‘, function (message) {
        var stockRequest = JSON.parse(message); //根据请求过来的数据来更新。
        console.log("服务器:收到消息", stockRequest);
        clientSpeeds = stockRequest[‘speed‘];
        sendSpeedUpdates(ws);
    });
    ws.on(‘close‘, function () {
        if (clientSpeedUpdater > 0) {
            //断开连接清楚定时器
            clearInterval(clientSpeedUpdater);
        }
    });
});

启动服务,效果截图(我用的pm2管理进程,可以直接node启动)

3.3简单实现聊天场景(待续。。。)

原文地址:https://www.cnblogs.com/zzghk/p/10573437.html

时间: 2024-08-27 12:37:57

Node构建WebSocket服务的相关文章

使用 Go 语言创建 WebSocket 服务

感谢参考原文-http://bjbsair.com/2020-04-01/tech-info/18504.html 今天介绍如何用 Go 语言创建 WebSocket 服务,文章的前两部分简要介绍了 WebSocket 协议以及用 Go 标准库如何创建 WebSocket 服务.第三部分实践环节我们使用了 gorilla/websocket 库帮助我们快速构建 WebSocket 服务,它帮封装了使用 Go 标准库实现 WebSocket 服务相关的基础逻辑,让我们能从繁琐的底层代码中解脱出来,

Node.js 构建TCP服务

构建TCP服务 三次握手连接: 1.客户端请求连接 2.服务器响应 3.开始传输 服务端 // 构建TCP服务 服务端 const net = require('net') const server = net.createServer() server.on('connection', clientSocket => { console.log('有新的客户端连接了') //服务端通过 clientSocket 监听 data 事件 clientSocket.on('data', data =

[转载] 基于Dubbo框架构建分布式服务

转载自http://shiyanjun.cn/archives/1075.html Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配置就能够实现分布式服务调用,也就是说服务提供方(Provider)发布的服务可以天然就是集群服务,比如,在实时性要求很高的应用场景下,可能希望来自消费方(Consumer)的调用响应时间最短,只需要选择Dubbo的F

构建高性能服务

构建高性能服务  ConcurrentSkipListMap和链表构建高性能Java Memcached 场景 缓存服务器是互联网后端服务中常用的基础设施. 场景(一)图片服务器上存储了大量图片,为了提高图片服务的吞吐量,希望把热门的图片加载到内存中. 场景(二)分布式存储服务,为提高访问吞吐,把大量的meta信息存储在内存中. 问题 但是使用Java语言开发缓存服务,不可避免的遇到GC问题.无论使用ehcache是基于Map实现的缓存,都会产生大量Minor GC无法回收的对象,最终导致CMS

node.js Websocket消息推送---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.

node.js Websocket实现扫码二维码登录---GoEasy

最近在做一个扫码登录功能,为此我还在网上搜了一下关于微信的扫描登录的实现方式.当这个功能完成了后,我决定将整个实现思路整理出来,方便自己以后查看也方便其他有类似需求的程序猿些. 要实现扫码登录我们需要解决两个问题: 1.  在没有输入用户名及密码的情况下,如何解决权限安全问题?换句话讲,如何让服务器知道扫码二维码的客户端是一个合法的用户? 2.  服务器根据用户在客户端的选择如何实时在网页上作出相应的响应? 首先我们先理一下微信的实现思路,来方便我们理解解决这一难题的思路方向.微信登录的二维码实

基于k8s、docker、jenkins构建springboot服务

Jenkins + github + docker + k8s + springboot 本文介绍基于k8s.docker.jenkins.springboot构建docker服务. 环境准备 server-1 k8s-master Centos7 ip地址10.12.5.110 server-2 k8s-node Centos7 ip地址10.12.5.115 两台服务执行如下命令 $ setenforce 0 $ systemctl stop firewalld $ systemctl di

python websocket服务

WebSocket 是一个标准化协议,构建在 TCP 之上,能够在客户端和服务端之间建立一个全双工的通信渠道.这里的客户端和服务端通常是用户浏览器和 Web 服务器.在 WebSocket 诞生之前,如果我们想保持这样的一个长连接,就需要使用诸如长轮询.永久帧.Comet 等技术.而现今 WebSocket 已经得到了所有主流浏览器的支持,我们可以使用它开发出在线聊天室.游戏.实时仪表盘等软件. 安装websockets第三发库 pip install websocketspip install

用nodejs快速实现websocket服务端(带SSL证书生成)

有不少公司将nodejs的socket.io作为websocket的解决方案,很遗憾的是socket.io是对websocket的封装,并不支持html5原始的websocket协议,微信小程序使用的websocket却是接近于html5原始websocket协议,socket.io居然没有用武之地了. 当然情况也没有惨到需要你自己一步一步去实现websocket服务端,我们的大node有很多websocket库,ws就是其中一个,号称最轻量级,最快.ws的用法比较简单,直接看github说明(