热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vue+websocket,实现简易聊天室

1.安装vue-cli2.init初始化项目3.npminstallws(websocket)4.文件夹中创建server.jsvaruserNum0统计人数varchatLi

1.安装vue-cli
2.init 初始化项目
3.npm install ws(websocket)
4.文件夹中创建server.js

var userNum = 0 // 统计人数
var chatList = []// 记录聊天内容
var WebSocketServer = require('ws').Server// 引入 ws
// 端口对应
var wss = new WebSocketServer({ port: 8080 })
// 调用broadcast广播,实现数据互通和实时更新
wss.broadcast = function (msg) {wss.clients.forEach(function (item) {item.send(msg)})
}
// 监听连接
wss.on('connection', function (ws) {userNum++wss.broadcast(JSON.stringify({ funName: 'userCount', users: userNum, chat: chatList })) // 建立连接成功广播一次当前在线人数console.log('连接人数:', userNum)// 接受前端发来消息ws.on('message', function (e) {var resData = JSON.parse(e) // 消息处理 字符串转为对象console.log('接收到来自clent的消息:' + resData.msg)// 每次发送信息,都会把信息存起来,然后通过广播传递出去,这样此每次进来的用户就能看到之前的数据chatList.push({ userId: resData.userId, content: resData.msg })// 每次发送都相当于广播一次消息wss.broadcast(JSON.stringify({ userId: resData.userId, msg: resData.msg }))})ws.on('close', function (e) {userNum--// 建立连接关闭广播一次当前在线人数wss.broadcast(JSON.stringify({ funName: 'userCount', users: userNum, chat: chatList }))console.log('Connected clients:', userNum)console.log('长连接已关闭')})
})
console.log('服务器创建成功')

在这里插入图片描述

<template><div class&#61;"chat-box"><div class&#61;"header">聊天室人数:{{count}}</div><scroll class&#61;"message" ref&#61;"scorll" :data&#61;"list"><div><div class&#61;"msg-box" ref&#61;"msgbox" v-for&#61;"(item,index) in list" :key&#61;"index"><span>{{item.content}}</span><div class&#61;"header-avtor"></div></div></div></scroll><div class&#61;"bottom"><div class&#61;"down"><input type&#61;"text" ref&#61;"sendMsg" v-model&#61;"contentText" /><button ref&#61;"btn" &#64;click&#61;"sendText">发送</button></div></div></div>
</template>
<script>
import Scroll from &#39;base/scroll/scroll&#39;
export default {data () {return {ws: null,count: 0,userId: null,list: [],contentText: &#39;&#39; // input输入的值}},created () {this.getUserId()},mounted () {this.initWebsocket()this.$refs.sendMsg.focus()},updated () {},methods: {getUserId () {let time &#61; new Date().getTime()this.userId &#61; time},// 滚动到底部scrollBottm () {let el &#61; this.$refs.msgboxel.scrollTop &#61; el.scrollHeightconsole.info(el.scrollHeight)},// 发送聊天消息sendText () {let _this &#61; this_this.$refs.sendMsg.focus()if (!_this.contentText) {return false}let params &#61; {userId: _this.userId,msg: _this.contentText}if (_this.ws.readyState &#61;&#61; 1) {_this.ws.send(JSON.stringify(params)) // 调用WebSocket send()发送信息的方法}_this.contentText &#61; &#39;&#39;},initWebsocket () {let _this &#61; this// 判断页面有没有存在websocket连接if (window.WebSocket) {let ws &#61; new WebSocket(&#39;ws://127.0.0.1:8080&#39;)_this.ws &#61; wsconsole.log(ws)ws.onopen &#61; function (e) {console.log(&#39;服务器连接成功&#39;)}ws.onclose &#61; function () {console.log(&#39;服务器连接关闭&#39;)}ws.onerror &#61; function () {console.log(&#39;服务器连接出错&#39;)}ws.onmessage &#61; function (e) {// 接收服务器返回的数据let resData &#61; JSON.parse(e.data)if (resData.funName &#61;&#61;&#61; &#39;userCount&#39;) {_this.count &#61; resData.users_this.list &#61; resData.chatconsole.log(_this.list, &#39;1234&#39;)} else {_this.list &#61; [..._this.list,{ userId: resData.userId, content: resData.msg }]}}}}},components: {Scroll},watch: {list () {this.$refs.scorll.refresh()}}
}
</script>
<style scoped>
.message {padding-top: 60px;margin-bottom: 60px;height: 100%;overflow: hidden;
}
.header {width: 100%;height: 50px;line-height: 50px;text-align: center;background: blue;color: #fff;font-size: 18px;position: fixed;top: 0;z-index: 2;
}
.bottom {position: fixed;bottom: 0;width: 100%;border-top: 1px solid #ccc;
}
.down {display: flex;align-items: center;padding: 5px;background: #fff;
}
.bottom input {flex: 1;height: 40px;font-display: 18px;
}
.bottom button {border: none;width: 70px;height: 44px;background: blue;color: #fff;line-height: 40px;text-align: center;border-radius: 5px;margin-left: 10px;
}
.msg-box {display: flex;align-items: center;justify-content: flex-end;width: 100%;margin: 20px 10px 0px 0px;
}.avtive {display: inline-block;background: blue;color: #fff;padding: 10px;font-size: 16px;border-radius: 6px;margin-right: 10px;flex-wrap: wrap;word-break: break-all;max-width: 220px;
}
.header-avtor {width: 40px !important;height: 40px;border-radius: 50%;background: #ccc;
}
.avtive-left {justify-content: flex-start;
}
</style>

node server.js 启动服务端
运行npm run dev即可
参考文章&#xff1a;https://www.jianshu.com/p/6e52493c3bae


推荐阅读
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • Ihaveaforminadirectivetemplate:我在指令模板中有一个表单:<formn ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
author-avatar
咖啡的因_411
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有