基于node+vue实现简单的WebSocket聊天功能


Posted in Javascript onFebruary 01, 2020

首先,我需要用到node的nodejs-websocket模块

使用yarn进行安装

yarn add nodejs-websocket --save

当然,你也可以用npm进行安装

npm i nodejs-websocket --save

安装完毕之后,我们开始写服务端的代码,首先,我用node在本地起了一个node服务器用来开启websocket服务

sock.js:

let ws = require("nodejs-websocket");
console.log("开始建立链接");
ws.createServer(function (conn) {
 conn.on("text", function (str) {
  console.log("收到的信息为", str);
   conn.send(`${str}(机器人`)
 });
 conn.on("close", function (code, reason) {
  console.log("关闭连接")
 });
 conn.on("error", function (code, reason) {
  console.log("异常关闭")
 })
}).listen(8001);
console.log("链接建立完毕");

服务端主要是用nodejs-websocket用来开启服务,以及返回前端需要的值,这里我只是做了一个简单的处理,在接受值得后面加了一个‘机器人'的string,

然后,我们需要开启这个node服务,

基于node+vue实现简单的WebSocket聊天功能

命令后面的路径一定要找对,我是把sock.js放在了根目录的socket文件夹下面

执行

yarn socket

最后,看我们的客户端,客户端我是想有一个输入框,然后有个聊天框:

<template>
 <div class="test3">
  <div class="msg" ref="box">
   <div v-for="item in list" :class="[item.type,'msg-item']">
    <p>
     {{item.content}}
    </p>
   </div>
  </div>
  <div class="input-group">
   <input type="text" v-model="contentText">
   <button @click="sendText">发送</button>
  </div>
 </div>
</template>
 
<script>
 export default {
  name: "index3",
  data() {
   return {
    list: [],//聊天记录的数组
    contentText: "",//input输入的值
   }
  },
  methods: {
   //发送聊天信息
    sendText() {
    let that = this;
    this.list = [...this.list, {type: "mine", content: this.contentText}];//通过type字段进行区分是自己(mine)发的还是系统(robot)返回的
    this.backText(function () {
     that.contentText = "";//加回调在得到返回数据的时候清除输入框的内容
    });
   },
   backText(callback) {
    let that = this;
    if (window.WebSocket) {
     let ws = new WebSocket("ws://192.168.11.169:8001");
     ws.onopen = function (e) {
      console.log("链接服务器成功");
      console.log("that.contentText is", that.contentText);
      ws.send(that.contentText);
      callback();
     };
     ws.onclose = function (e) {
      console.log("服务器关闭")
     };
     ws.onerror = function () {
      console.log("服务器出错")
     };
     ws.onmessage = function (e) {
      that.list = [...that.list, {type: "robot", content: e.data}]
     }
    }
   }
  },
  watch: {
   //监听list,当有修改的时候进行div的屏幕滚动,确保能看到最新的聊天
   list: function () {
    let that = this;
    setTimeout(() => {
     that.$refs.box.scrollTop = that.$refs.box.scrollHeight;
    }, 0);
    //加setTimeout的原因:由于vue采用虚拟dom,我每次生成新的消息时获取到的div的scrollHeight的值是生成新消息之前的值,所以造成每次都是最新的那条消息被隐藏掉了
   }
  },
  mounted() {
  }
 };
 
 
</script>
 
<style scoped lang="scss">
 .test3 {
  text-align: center;
 }
 
 .msg {
  width: 100px;
  height: 100px;
  overflow: auto;
  padding-top: 5px;
  border: 1px solid red;
  display: inline-block;
  margin-bottom: 6px;
 
  .msg-item {
   position: relative;
   overflow: hidden;
   p {
    display: inline-block;
    border-radius: 40px;
    background: #3C3D5A;
    color: white;
    float: left;
    padding: 2px 12px;
    margin: 0 0 2px 0;
    max-width: 70%;
    text-align: left;
    box-sizing: border-box;
   }
 
   &.mine {
    p {
     float: right;
     background: aquamarine;
     color: white;
    }
   }
  }
 } 
</style>

看一下最终效果:

基于node+vue实现简单的WebSocket聊天功能

基于node+vue实现简单的WebSocket聊天功能

Javascript 相关文章推荐
jQuery 全选效果实现代码
Mar 23 Javascript
js精度溢出解决方案
Dec 02 Javascript
给文字加上着重号的JS代码
Nov 12 Javascript
jQuery中:eq()选择器用法实例
Dec 29 Javascript
基于jquery实现表格无刷新分页
Jan 07 Javascript
jQuery组件easyui对话框实现代码
Aug 25 Javascript
js手动播放图片实现图片轮播效果
Sep 17 Javascript
简单实现jquery焦点图
Dec 12 Javascript
微信小程序中使用ECharts 异步加载数据实现图表功能
Jul 13 Javascript
Vue2.X 通过AJAX动态更新数据
Jul 17 Javascript
Vue常用的几个指令附完整案例
Nov 06 Javascript
vue实现单一筛选、删除筛选条件
Oct 26 Javascript
基于vue和websocket的多人在线聊天室
Feb 01 #Javascript
node crawler如何添加promise支持
Feb 01 #Javascript
js 计算月/周的第一天和最后一天代码
Feb 01 #Javascript
js获取本日、本周、本月的时间代码
Feb 01 #Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
Feb 01 #Javascript
vue学习笔记之过滤器的基本使用方法实例分析
Feb 01 #Javascript
vue学习笔记之slot插槽基本用法实例分析
Feb 01 #Javascript
You might like
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
php设计模式 FlyWeight (享元模式)
2011/06/26 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
jquery下为Event handler传递动态参数的代码
2011/01/06 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
python 生成器协程运算实例
2017/09/04 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
Python中进程和线程的区别详解
2017/10/29 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
python关于调用函数外的变量实例
2019/12/26 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
Snapfish英国:在线照片打印和个性化照片礼品
2017/01/13 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
护士自我评价范文
2014/01/25 职场文书
《理想》教学反思
2014/02/17 职场文书
房产买卖委托公证书
2014/04/04 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
合作合同协议书范本
2015/01/27 职场文书
全陪导游词开场白
2015/05/29 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
JavaScript中时间格式化新思路toLocaleString()
2021/11/07 Javascript
python脚本框架webpy模板赋值实现
2021/11/20 Python
Elasticsearch 索引操作和增删改查
2022/04/19 Python
vue 给数组添加新对象并赋值
2022/04/20 Vue.js