基于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 相关文章推荐
根据分辨率不同,调用不同的css文件
Jul 07 Javascript
js实时监听文本框状态的方法
Apr 26 Javascript
一些有用的JavaScript和jQuery的片段分享
Aug 23 Javascript
JS 添加千分位与去掉千分位的示例
Jul 11 Javascript
javascript中函数作为参数调用的方法
Feb 09 Javascript
JavaScript通过prototype给对象定义属性用法实例
Mar 23 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
Dec 26 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
Mar 13 Javascript
Javascript实现base64的加密解密方法示例
Jun 27 Javascript
js注册时输入合法性验证方法
Oct 21 Javascript
Vue框架TypeScript装饰器使用指南小结
Feb 18 Javascript
简单了解TypeScript中如何继承 Error 类
Jun 21 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 magic_quotes_gpc的使用方法详解
2013/06/24 PHP
php实现的发送带附件邮件类实例
2014/09/22 PHP
php常用的url处理函数总结
2014/11/19 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
PHP缓存集成库phpFastCache用法
2014/12/15 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
理解Javascript_03_javascript全局观
2010/10/11 Javascript
关于jQuery中.attr()和.prop()的问题探讨
2013/09/06 Javascript
js this函数调用无需再次抓获id,name或标签名
2014/03/03 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
2015/05/11 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
2016/08/15 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
微信小程序 开发之全局配置
2017/05/05 Javascript
微信小程序支付PHP代码
2018/08/23 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
Python实现抢购IPhone手机
2018/02/07 Python
Python实现图片拼接的代码
2018/07/02 Python
Pytorch释放显存占用方式
2020/01/13 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
2020/03/02 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
2020/06/05 Python
介绍一下你对SOA的认识
2016/04/24 面试题
2014年大学生自我评价
2014/01/19 职场文书
文明学生标兵事迹
2014/01/21 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
投标担保书范文
2014/04/02 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
股东授权委托书
2014/10/15 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers