基于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 相关文章推荐
javascript截取字符串(通过substring实现并支持中英文混合)
Jun 24 Javascript
js+css实现的简单易用兼容好的分页
Dec 30 Javascript
php析构函数的具体用法小结
Mar 11 Javascript
jquery实现全选功能效果的实现代码
May 05 Javascript
BootStrap 附加导航组件
Jul 22 Javascript
深入理解Angular2 模板语法
Aug 07 Javascript
基于Node的React图片上传组件实现实例代码
May 10 Javascript
Vue的路由动态重定向和导航守卫实例
Mar 17 Javascript
JS中实现浅拷贝和深拷贝的代码详解
Jun 05 Javascript
详解element-ui中表单验证的三种方式
Sep 18 Javascript
vue组件开发之tab切换组件使用详解
Aug 21 Javascript
详解ES6实现类的私有变量的几种写法
Feb 10 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
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
使用新的消息弹出框blackbirdjs
2008/10/16 Javascript
优化 JavaScript 代码的方法小结
2009/07/16 Javascript
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
对比分析json及XML
2014/11/28 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
判断访客终端类型集锦
2015/06/05 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
BootStrap的双日历时间控件使用
2017/07/25 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
2017/12/22 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
uni-app微信小程序登录授权的实现
2020/05/22 Javascript
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
abstract是什么意思
2012/02/12 面试题
财务人员个人自荐信范文
2013/09/26 职场文书
企业文化理念标语
2014/06/10 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
员工辞退通知书
2015/04/17 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL