基于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的js分页代码
Jun 10 Javascript
JS中获取数据库中的值的方法
Jul 14 Javascript
Javasipt:操作radio标签详解
Dec 30 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
Dec 25 Javascript
AngularJs学习第八篇 过滤器filter创建
Jun 08 Javascript
JavaScript中object和Object的区别(详解)
Feb 27 Javascript
js实现倒计时关键代码
May 05 Javascript
JavaScript表单即时验证 验证不成功不能提交
Aug 31 Javascript
PM2自动部署代码步骤流程总结
Dec 10 Javascript
js如何获取图片url的Blob值并预览示例代码
Mar 07 Javascript
javascript面向对象三大特征之继承实例详解
Jul 24 Javascript
JS实现横向轮播图(中级版)
Jan 18 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
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
JavaScript的parseInt 进制问题
2009/05/07 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
javascript数组排序汇总
2015/07/07 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
为什么JavaScript没有块级作用域
2016/05/22 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
vue + webpack如何绕过QQ音乐接口对host的验证详解
2018/07/01 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
2018/11/13 Javascript
使用puppeteer爬取网站并抓出404无效链接
2018/12/20 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
[01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
2018/08/24 DOTA
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
python flask几分钟实现web服务的例子
2019/07/26 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
django使用channels实现通信的示例
2020/10/19 Python
flask项目集成swagger的方法
2020/12/09 Python
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
构造方法和其他方法的区别
2016/04/26 面试题
任命书怎么写
2014/06/04 职场文书
学校教师读书活动总结
2014/07/08 职场文书
2014年后勤管理工作总结
2014/12/01 职场文书
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
代码复现python目标检测yolo3详解预测
2022/05/06 Python