基于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实现动态菜单的实例代码
Nov 28 Javascript
动态加载jQuery的方法
Jun 16 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
Dec 14 Javascript
用NODE.JS中的流编写工具是要注意的事项
Mar 01 Javascript
详解Node.js 命令行程序开发教程
Jun 07 Javascript
SVG动画vivus.js库使用小结(实例代码)
Sep 14 Javascript
基于js 字符串indexof与search方法的区别(详解)
Dec 04 Javascript
详解Vue 全局变量,局部变量
Apr 17 Javascript
JavaScript实现页面中录音功能的方法
Jun 04 Javascript
vue实现分页栏效果
Jun 28 Javascript
VUE注册全局组件和局部组件过程解析
Oct 10 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
Apr 24 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实现对象克隆的方法
2015/06/20 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
php操作access数据库的方法详解
2017/02/22 PHP
通过js获取div的background-image属性
2013/10/15 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
Scala解析Json字符串的实例详解
2017/10/11 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
React Native基础入门之调试React Native应用的一小步
2018/07/02 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
Python简单日志处理类分享
2015/02/14 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
Python随机生成身份证号码及校验功能
2018/12/04 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
Django 请求Request的具体使用方法
2019/11/11 Python
Python大数据之使用lxml库解析html网页文件示例
2019/11/16 Python
python关于变量名的基础知识点
2020/03/03 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
python中字典增加和删除使用方法
2020/09/30 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
汽车维修工岗位职责
2014/02/12 职场文书
销售总经理岗位职责
2014/03/15 职场文书
村班子对照检查材料
2014/08/18 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
电子商务专业求职信范文
2015/03/19 职场文书
法律讲堂观后感
2015/06/11 职场文书
结婚仪式主持词
2015/06/29 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书