Vue+Nodejs使用WebSocket创建一个简易聊天室教程

 更新时间:2025年06月16日 09:13:02   作者:不想起名55  
这篇文章主要介绍了Vue+Nodejs使用WebSocket创建一个简易聊天室教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、页面效果

二、架构流程

使用vue编写前端页面,nodejs处理服务端消息,WebSocket进行实时通信

三、技术细节

1.客户端

<template>
    <div>
        <form onsubmit="return false">
            <textarea  id="responseTest"  style="width: 500px; height: 300px"  ></textarea>
            <br />
            <input  type="text"  name="message"  style="width: 300px"  :value="inputVal"  @input="input"  />
            <input type="button" value="发送消息" @click="send(inputVal)" />
            <input type="button" value="清空聊天记录" @click="clean" />
        </form>
    </div>
</template>

<script>
export default {
    data() {
        return {
          inputVal: '欢迎来到二二得四的聊天室',
          socket:null
        }
    },
    methods: {
        testWebsocket() {
            if (!window.WebSocket) {
                window.WebSocket = window.MozWebSocket
            }
            if (window.WebSocket) {
                this.socket = new WebSocket('ws://localhost:8088/ws')
              this.socket.onmessage = function (event) {
                    var ta = document.getElementById('responseTest')
                    ta.value = ta.value + '\n' + event.data
                }
              this.socket.onopen = function (event) {
                    var ta = document.getElementById('responseTest')
                    ta.value = '连接开启!'
                }
                this.socket.onclose = function (event) {
                    var ta = document.getElementById('responseTest')
                    ta.value = '连接关闭!'
                }
            } else {
                alert('你的浏览器不支持WebSocket')
            }
        },
        input(e) {
            this.inputVal = e.detail.value
        },
        clean() {
            document.getElementById('responseTest').value = ''
        },
        send(message) {
            if (!window.WebSocket) {
                return
            }
          if (this.socket.readyState === WebSocket.OPEN) {
              this.socket.send(message)
            } else {
                alert('连接没有开启')
            }
        },
    },
    mounted() {
        this.testWebsocket()
    },
}
</script>

<style></style>

2. 服务端

使用的是nodejs

const ws = require('ws')

const webserve = new ws.Server({port:8088})

//打开WebSocket服务器:通过监听open事件打开服务器
webserve.on('open',function open() {
    console.log('connected')
})

//关闭WebSocket服务器:通过监听close事件关闭服务器
webserve.on('close',function close() {
    console.log('disconnected')
})

//监听连接:ws通过connection事件来监听连接
webserve.on('connection',function connection(res,req) {
    const ip1 =  req.headers['x-forwarded-for'] || req.socket.remoteAddress
    const port1 = req.socket.remotePort
    const clientName = ip1+port1
    console.log('连接已开启,开始发送消息')

    // 发送数据:ws通过send()方法来发送到客户端数据
    // res.send('welcome,'+clientName)

  //接收数据:ws通过message事件来接收数据。当客户端有消息发送给服务器时,服务器就能够触发该消息
    res.on('message',function incoming(message) {
        console.log('received: %s from %s',message,clientName)

        /**
         * 准备的状态:ws中WebSocket类具有以下4中准备状态
         * 1、CONNCETION:值为0,表示连接还没有打开
         * 2、OPEN:值为1,表示连接已经打开,可以通信了
         * 3、CLOSING:值为2,表示连接正在关闭
         * 4、CLOSED:值为2,表示连接已经关闭
         */
        webserve.clients.forEach(function each(client) {
            if(client.readyState === ws.OPEN){
                client.send(message.toString())
            }
        })
    })
})

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue2 前后端分离项目ajax跨域session问题解决方法

    vue2 前后端分离项目ajax跨域session问题解决方法

    本篇文章主要介绍了vue2 前后端分离项目ajax跨域session问题解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Vue中使用和移除总线Bus的注意事项详解

    Vue中使用和移除总线Bus的注意事项详解

    Vue中的总线Bus是一种通信机制,可用于组件间的数据传递和事件触发。使用时需要注意Bus的命名和定义、监听和触发事件的方法、移除和销毁Bus的时机和方式等问题。合理使用总线Bus可以提高组件的复用性和可维护性,但过度依赖可能会导致代码耦合和难以维护
    2023-04-04
  • vite构建vue3项目的全过程记录

    vite构建vue3项目的全过程记录

    vite是VUE3创建项目的工具,项目大了之后,性能明显优于webpack,下面这篇文章主要给大家介绍了关于vite构建vue3项目的相关资料,需要的朋友可以参考下
    2023-01-01
  • vue引入js数字小键盘的实现代码

    vue引入js数字小键盘的实现代码

    这篇文章主要介绍了vue引入js数字小键盘的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • uni-app中vue3表单校验失败的问题及解决方法

    uni-app中vue3表单校验失败的问题及解决方法

    最近遇到这样的问题在app中使用uni-forms表单,并添加校验规则,问题是即使输入内容,表单校验依然失败,本文给大家分享uni-app中vue3表单校验失败的问题及解决方法,感兴趣的朋友一起看看吧
    2023-12-12
  • 基于Vue封装实现全屏功能工具类

    基于Vue封装实现全屏功能工具类

    在 Web 应用程序中,有时需要为某些内容提供全屏显示的功能,本文将介绍如何使用 Vue.js 3 的 Composition API 创建一个全屏功能的工具类,希望对大家有所帮助
    2024-03-03
  • Vue2.x与Vue3.x中路由钩子的区别详解

    Vue2.x与Vue3.x中路由钩子的区别详解

    这篇文章主要介绍了Vue2.x与Vue3.x中路由钩子的区别,分别介绍了路由钩子的分类,路由配置守卫钩子以及组件内守卫钩子等有需要的朋友可以借鉴参考下
    2021-09-09
  • vue关于重置表单数据出现undefined的解决

    vue关于重置表单数据出现undefined的解决

    这篇文章主要介绍了vue关于重置表单数据出现undefined的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Vuex 使用 v-model 配合 state的方法

    Vuex 使用 v-model 配合 state的方法

    这篇文章主要介绍了Vuex 使用 v-model 配合 state的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • vue watch自动检测数据变化实时渲染的方法

    vue watch自动检测数据变化实时渲染的方法

    本篇文章主要介绍了vue watch自动检测数据变化实时渲染的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01

最新评论