使用WebSocket + Node.js搭建简单版聊天室

效果

WebSocket 对象提供了用于创建和管理WebSocket连接,以及可以通过该连接发送和接收数据的 API。

属性:

  • WebSocket.binaryType
    使用二进制的数据类型连接

  • WebSocket.bufferedAmount (只读)
    未发送至服务器的字节数

  • WebSocket.extensions (只读)
    服务器选择的扩展

  • WebSocket.onclose
    用于指定连接关闭后的回调函数

  • WebSocket.onerror
    用于指定连接失败后的回调函数

  • WebSocket.onmessage
    用于指定当从服务器接受到信息时的回调函数

  • WebSocket.onopen
    用于指定连接成功后的回调函数

  • WebSocket.protocol (只读)
    服务器选择的下属协议

  • WebSocket.readyState (只读)
    当前的链接状态

  • WebSocket.url (只读)
    WebSocket 的绝对路径

方法

  • WebSocket.close([code[, reason]])
    关闭当前链接
  • WebSocket.send(data)
    向服务器发送数据

🤒好吧!!! 一本正经的抄MDN文档

开始摸手

安装node不提。

1、安装WebSocket

$ npm install ws

2、创建package.json (那些选项不懂可以Google)

$ npm init

3、新建index.html 用于访问
4、新建index.js 用于写node服务器


文件

index.js文件

const WebSocket = require('ws');// 导入WebSocket模块:
const WebSocketServer = WebSocket.Server;// 引用Server类:
const wss = new WebSocketServer({ port: 3000 });// 实例化: 端口3000

index.html

 var sock = new WebSocket('ws://localhost:3000');
   sock.onopen = (params) => {
      console.log('连接成功!');
      console.log(params);
    }
    sock.onerror = (error) => {
      console.log('连接失败!');
      console.log(error);
    }

运行

$ node index.js

在浏览打开index.html文件
打开控制台 ==> Network ==> WS
如下图

控制台.png

走到这一步说明你已经成功连接了吧!!

接下来使用send()传输数据。

1、客户端 ==> 服务器端

index.html

  var sock = new WebSocket('ws://localhost:3000');
    sock.onopen = (params) => {
      console.log('连接成功!');
      console.log(params);
      sock.send('我是前台数据')
    }
    sock.onerror = (error) => {
      console.log('连接失败!');
      console.log(error);
    }

index.js //服务器端

const WebSocket = require('ws');// 导入WebSocket模块:
const WebSocketServer = WebSocket.Server;// 引用Server类:
const wss = new WebSocketServer({ port: 3000 });// 实例化: 端口3000
wss.on('connection', function(ws) {
    // 接收客户端数据
    ws.on('message', (message)=> {
      console.log(message); //我是前台数据
    });
  })

看浏览器控制把数据传过去


客户端-控制台

可以看得出控制台打印出,客户端传给后台的数据。

服务器端-控制台

2、客户端 <== 服务器端

一样的操作。直接上代码!
index.html

   sock.onmessage = function (ms) {
      console.log(ms); 
    }

客户端使用onmessage接收数据

index.js

wss.on('connection', function(ws) {
    // 接收客户端数据
    ws.on('message', (message)=> {
      console.log(message);
      ws.send('我是后台数据') //服务器发送数据给客户端
    });

  })
控制台.png

就到这吧!上全代码!!
index.html

  <div id="content">
    <div id="log"></div>
  </div>
  <div id="sendCtrls">
    <input id="name" name="name" type="text" />
    <button id="button">发送</button>
  </div>

  <script>
    var name = prompt('你叫什么名字???')
    var sock = new WebSocket('ws://localhost:3000');
    var log = document.getElementById('log')
    sock.onopen = (params) => {
      // 发送名字
      sock.send(JSON.stringify({
        type: 'name',
        data: name
      }))
    }
    // 接收数据
    sock.onmessage = function (ms) {
      var json = JSON.parse(ms.data)
      log.innerHTML += `${json.name}    <${json.time}> <br>${json.data}<br>`
    }
    // 提交输入的数据
    document.getElementById('button').onclick = function () {
      var text = document.getElementById('name').value
      // sock.send(text)
      // 时间
      var date = new Date();
        h = date.getHours() + ':';
        m = date.getMinutes() + ':';
        s = date.getSeconds(); 

      sock.send(JSON.stringify({
        type: 'message',
        data: text,
        time: h+m+s
      }))

      log.innerHTML +=  `自己    <${h+m+s}> <br>${text}<br>`
      document.getElementById('name').value = ''
    }
  </script>

index.js


const WebSocket = require('ws');// 导入WebSocket模块:
const WebSocketServer = WebSocket.Server;// 引用Server类:
const wss = new WebSocketServer({ port: 3000 });// 实例化: 端口3000


wss.on('connection', function(ws) {
    // 接收客户端数据
    ws.on('message', (message)=> {
      message = JSON.parse(message)
      if(message.type == 'name'){
        ws.userName = message.data;
        return;
      }
      wss.clients.forEach((client)=>{
        // 过滤相同的消息
        if(client != ws){
          //  ms.send(message)
          client.send(JSON.stringify({
             name: ws.userName,
             data: message.data,  //注意是message
             time:  message.time
           }))
        }
      })
    });
    // 关闭 断开的客户端
    ws.on('close',function () {
      console.log('什么鬼---------');
    })
  });

PS:运行可以打开多个index.html进行操作。
可以下载DEMO 试着运行

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352