基于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 ui(接口)介绍
Sep 17 Javascript
jQuery 中使用JSON的实现代码
Dec 01 Javascript
一行代码告别document.getElementById
Jun 01 Javascript
解析Jquery中如何把一段html代码动态写入到DIV中(实例说明)
Jul 09 Javascript
jQuery实现鼠标划过展示大图的方法
Mar 09 Javascript
JavaScript中使用指数方法Math.exp()的简介
Jun 15 Javascript
JavaScript兼容性总结之获取非行间样式案例
Aug 07 Javascript
Vue.js第四天学习笔记(组件)
Dec 02 Javascript
javascript监听页面刷新和页面关闭事件方法详解
Jan 09 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
Jan 03 Javascript
jQuery实现定时隐藏对话框的方法分析
Feb 12 jQuery
JS PHP字符串截取函数实现原理解析
Aug 29 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 file_get_contents函数轻松采集html数据
2010/04/22 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
Zend Framework数据库操作技巧总结
2017/02/18 PHP
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
2016/07/18 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
给vue项目添加ESLint的详细步骤
2017/09/29 Javascript
微信小程序学习笔记之函数定义、页面渲染图文详解
2019/03/28 Javascript
javascript Canvas动态粒子连线
2020/01/01 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
python super的使用方法及实例详解
2019/09/25 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
500行python代码实现飞机大战
2020/04/24 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
草莓网中国:StrawberryNet中国
2020/08/17 全球购物
比较一下entity bean和session bean
2013/12/27 面试题
工商管理实习自我鉴定
2013/09/28 职场文书
舞蹈教育学专业推荐信
2013/11/27 职场文书
大三学生入党思想汇报
2014/01/02 职场文书
十一酒店活动方案
2014/02/20 职场文书
作风大整顿心得体会
2014/09/10 职场文书
2014年图书室工作总结
2014/12/09 职场文书
2014年终个人总结报告
2015/03/09 职场文书
环保建议书作文500字
2015/09/14 职场文书
Redis 配置文件重要属性的具体使用
2021/05/20 Redis
Python序列化模块JSON与Pickle
2022/06/05 Python