简单本地websocket运行实例(vue3)

这篇具有很好参考价值的文章主要介绍了简单本地websocket运行实例(vue3)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.完善一下登陆页面,方便后续使用

2.具体实现vue页面

3.hooks文件夹建立,存放websocket设置

4.建立src的同级server文件夹,用于后端启动websocket服务

5.创建index.js文件,编写websocket代码

6.在server目录下,通过npm run dev运行后端代码

 7.效果展示


整体代码:

1.完善一下登陆页面,方便后续使用

<template>
  <div>
    <div class="content">
      <div class="loginForm">
        <div class="form-item-title">
          登录
        </div>
        <div class="form-item">
          <span>用户名</span>
          <input type="text" placeholder="输入用户名" v-model="userName" />
        </div>
        <div class="form-item">
          <span>密码</span>
          <input type="text" placeholder="输入密码" v-model="password" />
        </div>
        <div class="form-item-btn">
          <button class="form-item" @click="goPage()">进入聊天室</button>
        </div>
       
      </div>
     
    </div>
  </div>
</template>

<script setup >
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'

const router = useRouter()
const userName = ref('')
const password = ref('')

// 跳转页面
const goPage = () => {
  const _username = userName.value.trim()
  const _password = password.value.trim()

  if (_username.length < 6) {
    alert('用户不小于6位')
    return
  }
  if(_username !== _password){
    alert('密码错误!')
    return
  }
// 储存本地用户信息
  localStorage.setItem('userName', _username)
  userName.value = ''
  password.value = ''
  router.push('home')
}

// 页面加载时检测
onMounted(() => {
  userName.value = localStorage.getItem('userName')
  if (userName.value) {
    router.push('/')
    return
  }

})

</script>

<style >
.content {
  width: 1000px;
  margin: 100px auto;
  display: flex;
  justify-content: center;
}
.loginForm{
  display: flex;
  flex-direction: column;
}
.form-item-title{
  font-size: 25px;
  display: flex;
  justify-content: center;
}
.form-item{
  display: flex;
margin-top: 20px;
}
.form-item span{
  flex: 1;
}
.form-item-btn{
  display: flex;
  justify-content: center;
}
</style>

2.具体实现vue页面

<template>
  <div>
    <span>当前用户:{{ userName }}</span>
    <div class="content">
      <div class="msg-box">
        <ul>
          <li v-for="item of state.msglist" :key="item.id" :class="item.user === userName ? 'msg-whoSend' : ''">
            <div>
              <span>
                {{ item.user }}
              </span>
              <span>
                {{ new Date(item.dateTime) }}
              </span>
            </div>
            <div class="msg-other" :class="item.user === userName ? 'my-send-msg-box' : ''">
              <div class="my-send-msg-bgc my-send-msg" >
                <span>
                {{ item.msg }}
              </span>
              </div>
             
            </div>
          </li>
        </ul>
      </div>
      <div class="msg-send">
        <textarea type="textarea" placeholder="输入消息" v-model="state.inputMessage"></textarea>
        <button class="form-item" @click="sendMessage">发送</button>
      </div>

    </div>
  </div>
</template>

<script setup >
import { onMounted, reactive, ref, watch } from 'vue';
import { useRouter } from 'vue-router';
import { useWebSocket } from '@/hooks/index';
// 引入 websocket
const ws = useWebSocket(handleMessage)
const router = useRouter()
// 接收服务器端的 messageList
function handleMessage(e) {
  const msgData = JSON.parse(e.data)
  state.msglist.push(msgData)
}


const state = reactive({
  inputMessage: '',
  msglist: []
})
const userName = ref('')

// 页面加载时检测是否登录,目前没有写路由守卫,后期迁移到守卫里
onMounted(() => {
  userName.value = localStorage.getItem('userName')
  if (!userName.value) {
    router.push('/')
    return
  }
})

// 发送信息
const sendMessage = () => {
  const msg = state.inputMessage
  if (!msg.trim().length) {
    return
  }
  ws.send(JSON.stringify({
    id: new Date().getTime(),
    user: userName.value,
    dateTime: new Date().getTime(),
    msg: state.inputMessage
  }))

  state.inputMessage = ''
}

// 检测 消息列表,将展示页面滚动条到底
watch(state.msglist,()=>{
  const msgBox = document.querySelector('.msg-box');
  setTimeout(() => {
    msgBox.scrollTop = msgBox.scrollHeight;
  }, 100);

})
</script>

<style >
ul {
  list-style: none;
}

.content {
  width: 1400px;
  min-height: 700px;
  display: flex;
  flex-direction: column;
  margin: 10px auto;
  border: 1px solid #000;
}

.msg-box {
  height: 550px;
  width: 100%;
  overflow: auto;
  border-bottom: 1px solid #000;
}

.msg-box ul li {
  margin-top: 20px;
}

.msg-box .msg-whoSend {
  text-align: end;
  display: flex;
  flex-direction: column;
}
.msg-other{
  display: flex;
margin-top: 10px;
}
.my-send-msg-box{
  justify-content: end;
}
.my-send-msg{
  max-width: 700px;
  word-wrap: break-word;
}
.my-send-msg-bgc{
      border-radius: 10px;
    padding: 10px;
  background-color: #95ec69;
}

.msg-send {
  width: 100%;
  height: 200px;
  position: relative;
}

.msg-send textarea {
  width: 100%;
  height: 100%;
  padding: 0px;
  margin: 0px;
}

.msg-send button {
  position: absolute;
  bottom: 5px;
  right: 10px;
  font-size: 20px;
}</style>

3.hooks文件夹建立,存放websocket设置

页面结构如图:

vue3 websocket,vue项目框架搭建/添加,websocket,javascript,vue.js

 index.js

import useWebSocket from './websocket'
export { useWebSocket }

 websocket.js

function useWebSocket(handleMessage){

  // websocket服务路径
  let url = 'ws://localhost:8000'
  const ws = new WebSocket(url)

  // 初始化
  const init=()=>{
    bindEvent()
  }

  // 方法绑定 见名思意
  function bindEvent(){
    ws.addEventListener('open',handleOpen,false)
    ws.addEventListener('close',handleClose,false)
    ws.addEventListener('error',handleError,false)
    ws.addEventListener('message',handleMessage,false)

  }

  function handleOpen(e){
    console.log('websocket open',e)
  }
  function handleClose(e){
    console.log('websocket close',e)
    
  }
  function handleError(e){
    console.log('websocket error',e)
    
  }

  init()

  return ws


}
export default useWebSocket;

4.建立src的同级server文件夹,用于后端启动websocket服务

先建立一个文件夹server,进入文件夹 cd server

结构如下:

vue3 websocket,vue项目框架搭建/添加,websocket,javascript,vue.js

 新开一个控制台:输入npm init -y 创建结构

npm init -y

 此时目录结构出来了:输入yarn add ws 引入websocket

yarn add ws

 修改server文件里的package.json文件

将如下代码覆盖原来的:

"dev": "nodemon index.js"

vue3 websocket,vue项目框架搭建/添加,websocket,javascript,vue.js

 如果没有nodemon  需要引入:npm install -g nodemon

npm install -g nodemon

5.创建index.js文件,编写websocket代码

const WebSocket = require('ws');

((Ws)=>{
  const server = new Ws.Server({port:8000})
  
  const init =()=>{
    bindEvent()
  }
function bindEvent(){
  server.on('open',handleOpen);
  server.on('close',handleClose);
  server.on('error',handleError);
  server.on('connection',handleConnection);
}

function handleOpen(){
  console.log('websocket open')

}
function handleClose(){
  console.log('websocket close')
  
}
function handleError(){
  console.log('websocket error')
  
}
function handleConnection(ws){
  console.log('websocket connection')
  ws.on('message',handleMessage)
}
// 接受的 前端传入的信息 在进行广播
function handleMessage(msg){
  console.log(msg.toString())
  server.clients.forEach((c)=>{
    c.send(msg.toString())
  })

}

init()

})(WebSocket);

6.在server目录下,通过npm run dev运行后端代码

启动如图:

vue3 websocket,vue项目框架搭建/添加,websocket,javascript,vue.js

 7.效果展示

由于是本地,多用户实现不方便,所以可以复制网址,再开一个页面,重新登陆进来,此时,有两个页面,第一次登陆的不要刷新,因为此时用户信息已经是用户2的了

vue3 websocket,vue项目框架搭建/添加,websocket,javascript,vue.jsvue3 websocket,vue项目框架搭建/添加,websocket,javascript,vue.js

 

 

vue3 websocket,vue项目框架搭建/添加,websocket,javascript,vue.js

 

 用户1发消息:

vue3 websocket,vue项目框架搭建/添加,websocket,javascript,vue.js

 此时用户2 :收到信息,再回复

vue3 websocket,vue项目框架搭建/添加,websocket,javascript,vue.js

 一个简单了websocket通信就完成了文章来源地址https://www.toymoban.com/news/detail-741491.html

到了这里,关于简单本地websocket运行实例(vue3)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3项目使用WebSocket 传输 Protobuf 格式的数据

    前端和后端数据传输常用数据格式: JSON(JavaScript Object Notation):与 HTTP 协议和 REST API 配合使用时,JSON 数据是最常用的数据格式之一。对于 WebSocket,JSON 数据同样适用。客户端可以将消息转换为 JSON 对象,并将其发送到服务器进行处理,在服务器上生成响应并返回给客户端

    2024年02月10日
    浏览(53)
  • Vite + Vue3 + Ts 【免key、免账号实战本地运行GPT】

    🐔 前期回顾 Vue3 + Ts + Vite —— 封装庆祝彩屑纷飞 示例_彩色之外的博客-CSDN博客 封装 彩屑纷飞 示例 https://blog.csdn.net/m0_57904695/article/details/131718019?spm=1001.2014.3001.5501 目录  🌍 公网  🛹 本地  🪂  源码  🐔  GPT-4 有识图功能 移动版  🤺 移动版APK安装包  免魔法合集GPT、

    2024年02月16日
    浏览(49)
  • Vite-Admin后台管理系统|vite4+vue3+pinia前端后台框架实例

    基于 vite4.x+vue3+pinia 前端后台管理系统解决方案 ViteAdmin 。 前段时间分享了一篇vue3自研pc端UI组件库VEPlus。这次带来最新开发的基于 vite4+vue3+pinia 技术栈搭配ve-plus组件库构建的中后台权限管理系统框架。 支持vue-i18n国际化多语言、动态路由鉴权、4种布局模板及tab页面缓存 等功

    2023年04月13日
    浏览(87)
  • vue3项目打开本地pdf文件实现方法

    效果图 引入pdf插件 注意一定要这个版本,不然会报错 key.split(...).at is not a function pdf页面封装 pdf存放目录 具体实现就这么多,欢迎来吐槽! 结语 一个人久了连喜欢上一个人都好难,不要轻易地拒绝学习新知,因为你所拒绝的不是别人,而是你自己的成长之路。

    2024年02月12日
    浏览(56)
  • vue3项目打包后整合到springboot项目中运行

    一般来说,前后端分离项目,比如vue3+springboot的前后端分离项目,一般把vue3项目打包后部署到nginx或者tomcat上面,springboot项目单独打包。 那如果想把vue3项目打包后直接部署到springboot项目中,如何做那? 创建vue项目 创建项目 安装依赖 启动开发服务器(项目目录) 如果要部

    2024年02月05日
    浏览(33)
  • vben:vue3后台管理项目框架

    前言:         Vue-Vben-Admin 是一个基于 Vue3.0、Vite、 Ant-Design-Vue、TypeScript 的后台解决方案,目标是为开发中大型项目提供开箱即用的解决方案。包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能。项目会使用前端较新的技术栈,可以作为项目

    2023年04月08日
    浏览(42)
  • Vue3.X 创建简单项目

    首先,我们要确保我们安装了构建vue框架的环境,不会安装的请自行百度,有很多安装教程。 检查环境  这些环境都安装了之后就可以进行vue项目的搭建了。  进入你要创建vue项目的目录下进行项目创建,输入: vue create “项目名称”, 例: 选择 Manually select  features  选项

    2024年02月12日
    浏览(40)
  • uniapp 小程序 使用vue3+ts运行项目

    uniapp官网教程:uni-app官网 创建方式有2种 第一种:通过HBuilderX可视化界面创建 第二种:通过vue-cli命令行 注意:若不能直接使用命令下载,可去gitee下载模板使用 下载完模板后进行解压,利用vscode打开文件,会发现报这样的错误👇主要原因是没有下载依赖 解决以上错误:使

    2024年02月13日
    浏览(57)
  • 如何将github上的Vue项目在本地运行起来?

    今天在github逛的时候发现几个Vue博客前端模板,觉得挺好看的,就拉到本地上,启动项目发生报错,捣鼓一会儿,下面将介绍,如何成功地将项目运行起来。 1.打开package.json文件 如果显示serve,就在终端切换到项目,输入 npm run serve ,进行启动。若显示dev,就 npm run dev 原因:因为

    2024年02月13日
    浏览(43)
  • vue3项目引入本地js文件,实现一个音频播放按钮

    目前有一个需求就是在网页上放置一个音乐控制按钮,并且是在vue3项目里面。于是小白的我遇到了2个问题,第一个问题是如何实现没有进度条的播放按钮,这个网上有现成的代码,可以通过js代码切换不同的图片或者是别的样式,并不算难;第二个问题是如何在vue3项目中引

    2024年02月19日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包