基于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 相关文章推荐
Prototype使用指南之string.js
Jan 10 Javascript
js遍历td tr等html元素
Dec 13 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
Mar 17 Javascript
canvas实现图像截取功能
Feb 06 Javascript
AngularJS路由Ui-router模块用法示例
May 29 Javascript
Node 自动化部署的方法
Oct 17 Javascript
layui radio单选限制下一个radio单选的实例
Sep 03 Javascript
Vue使用NProgress进度条的方法
Sep 21 Javascript
vue的三种图片引入方式代码实例
Nov 19 Javascript
JavaScript实现简易计算器小功能
Oct 22 Javascript
JS异步堆栈追踪之为什么await胜过Promise
Apr 28 Javascript
Vue Element plus使用方法梳理
Dec 24 Vue.js
基于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
php 多线程上下文中安全写文件实现代码
2009/12/28 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
PHP+redis实现的购物车单例类示例
2019/02/02 PHP
动态加载js文件 document.createElement
2006/10/14 Javascript
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
2011/10/31 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
jQuery stop()用法实例详解
2016/07/28 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
js鼠标经过tab选项卡时实现切换延迟
2017/03/24 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
javascript获取select值的方法完整实例
2019/06/20 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
python 正则式使用心得
2009/05/07 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
2018/04/24 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
解决python给列表里添加字典时被最后一个覆盖的问题
2019/01/21 Python
pycharm配置git(图文教程)
2019/08/16 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
什么是CSS3 HSLA色彩模式?HSLA模拟渐变色条
2016/04/26 HTML / CSS
华为的Java面试题
2014/03/07 面试题
建筑自我鉴定
2013/10/19 职场文书
司法局火灾防控方案
2014/06/05 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
法定代表人证明书
2014/11/28 职场文书
同乡会致辞
2015/07/30 职场文书
早恋主题班会
2015/08/14 职场文书
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python