基于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获取元素样式属性值的方法
Dec 25 Javascript
Jquery如何实现点击时高亮显示代码
Jan 22 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
Apr 07 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
Dec 05 Javascript
javascript this详细介绍
Sep 19 Javascript
jQuery解析XML 详解及方法总结
Sep 28 Javascript
Puppeteer环境搭建的详细步骤
Sep 21 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
Feb 21 Javascript
原生JS实现随机点名项目的实例代码
Apr 30 Javascript
vue-cli3项目展示本地Markdown文件的方法
Jun 07 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
Jun 17 Javascript
五句话帮你轻松搞定js原型链
Dec 09 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
php中array_slice和array_splice函数解析
2016/10/18 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
Laravel实现定时任务的示例代码
2017/08/10 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
img的onload的另类用法
2008/01/10 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
使用js操作cookie的一点小收获分享
2013/09/03 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
js实现随机点名程序
2020/09/17 Javascript
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
Python的条件语句与运算符优先级详解
2015/10/13 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
python查看模块,对象的函数方法
2018/10/16 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
微软澳洲官方网站:Microsoft Australia
2017/01/10 全球购物
vue+django实现下载文件的示例
2021/03/24 Vue.js
车工岗位职责
2013/11/26 职场文书
旅游网创业计划书
2014/01/31 职场文书
运动会致辞稿50字
2014/02/04 职场文书
会计岗位职责模板
2014/03/12 职场文书
年终总结会议主持词
2014/03/17 职场文书
查摆问题自查报告范文
2014/10/13 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
社区低保工作总结2015
2015/07/23 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
Django基础CBV装饰器和中间件
2022/03/22 Python