浅尝websocket,node做websocket实现聊天室

做一个websocket简单的尝试,node和客户端能够成功链接并且能正常接收发送数据。

一.websocket简介

WebSocket是基于TCP的应用层协议,用于在C/S架构的应用中实现双向通信。
需要特别注意的是:虽然WebSocket协议在建立连接时会使用HTTP协议,但这并不意味着WebSocket协议是基于HTTP协议实现的。
在这里插入图片描述

二.node实现

node 不能直接使用websocket,需要安装支持websocket的包,这里用的是nodejs-websocket
安装:npm install nodejs-websocket


const ws = require("nodejs-websocket");

//定义一个arr,用于收集多用户信息
const arr = {}; 

ws.createServer(function (socket) { //连接成功的回调

	//监听数据,当客户端传来数据时的操作
    socket.on("text", function (str) {
      var data = JSON.parse(str); //数据只能是以字符串或buffer形式传递,所以这里要转换成JSON;
      if (arr[data.username]) { //如果不是第一次连接
      
		//将用户发来的信息对所有用户发一遍
        for (var item in arr) { 
          arr[item].sendText(
            JSON.stringify({
              username: data.username,
              text: data.mes,
            })
          );
        }
      } else { //如果是第一次连接
        arr[data.username] = socket;
      }
    });
  })
  .listen(4000);

三.客户端实现

新建一个html文件

	<!DOCTYPE html>

<head>
    <title>

    </title>
    <style>
        .chatContext {
            width: 100px;
            height: 300px;
            border: 1px solid #ddd;
        }
    </style>
</head>

<body>
    <div id="chatContext"></div>
    <input id="input" />
    <button id="send">发送</button>
    <script type="text/javascript">
        var localChat = [];
		
		//这里对localChat 的push方法进行了重写,只要localChat 有数据push进来就对#chatContext重新渲染
        var arrayProto = Array.prototype;
        var arrayMethod = Object.create(arrayProto);
        arrayMethod.push = function () {
            var original = arrayProto.push;
            var _result = original.apply(this, arguments);
            var _html = '';
            localChat.forEach(mes => {
                _html += mes.username + ':';
                _html += mes.text + '</br>';
            })
            document.getElementById('chatContext').innerHTML = _html;
            return _result;
        }
        localChat.__proto__ = arrayMethod;
		
		//建立一个websocket,上面node里我们提到过,websocket只能传输字符串或者buffer,所以我们发送的数据要转换成字符串
        var ws = new WebSocket("ws:127.0.0.1:4000");
		//与服务器连接成功后向服务端发送一条数据
        ws.onopen = function () {
            ws.send(JSON.stringify({
                username: '会飞',
                mes: ''
            }))
        }
		
		//当从服务端接受到参数时,向localChat push一条数据,上面我们已经对localChat 的push方法重写,这时候页面会渲染
        ws.onmessage = function (data) {
            localChat.push(JSON.parse(data.data))
        }
		
		//监听点击事件,当点击发送时,像服务端发送一条数据;
        document.getElementById('send').onclick = function () {
            var _mes = document.getElementById('input').value;
            ws.send(JSON.stringify({
                username: '会飞',
                mes: _mes
            }))
        }
    </script>
</body>

</html>

一个html页面就完成了,我们可以再复制一个,以便测试websocket是否能实时推送数据

四.成功连接

我们现在已经有一个node文件server.js和两个html文件
执行node server.js启动服务端,打开两个html文件,已经能够正常通信

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

[扩展]socket.io https://zhuanlan.zhihu.com/p/29148869

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值