当前位置: 首页 > news >正文

Nodejs+Websocket+uniapp完成聊天

前言

最近想做一个聊天,但是网上的很多都是不能实现的,要么就是缺少代码片段很难实现websocket的链接,更别说聊天了。自己研究了一番之后实现了这个功能。值得注意的是,我想在小程序中使用socket.io,不好使,可能是个人技术不到位的问题吧,没有实现。但是使用websocket可以完成这个功能。

环境准备

node @14.16.1

express @4.19.2

vsocde

HbuilderX

微信开发者工具

后端的依赖

后端代码

app.js文件的代码

// express具体使用看我提供个文章中有
const express = require('express')
const app = express()
const websocket = require('websocket').server
const http = require('http')const httpServer = http.createServer().listen(3000,()=>{console.log('http server is running at port 3000');
})
const websocketServer = new websocket({httpServer: httpServer,autoAcceptConnections: false
})const conArr = []websocketServer.on('request', function(request) {// 这就是一次客户端发送的消息// websocket 需要将这个链接保存起来// 只要客户端和服务器没有断开,这个链接必须在// 客户端与服务端的通信都是从这个链接上通信const connection = request.accept()// 每次接收一个链接,将它存放在数组里面conArr.push(connection)// 监听客户端发送的消息connection.on('message', function(message) {console.log(message);// 发送消息给客户端(广播到各个客户端)// 后面加上 utf8Data 编码// 要将所有的链接全部发出去,才可以让每个客户端接收到其他传来的数据for(let i = 0; i < conArr.length; i++) {conArr[i].send(message.utf8Data)}})
})app.get('/', (req, res) => {res.send('Hello World!')
})app.listen(8080, () => {console.log('Express server is running at port 3000');
})

简单分析一下,websocket是基于http协议的所以要导入http模块,express和websocket监听的端口不一样,这样的话前端可以调用存储聊天信息的接口往数据库表中插入聊天信息,这样就可以完成聊天记录的存储,现在这个demo就是做了一个简单的websocket的链接和简陋的聊天界面。后续会完善一个开源项目完成聊天的功能、撤回和聊天记录回显的功能。

前端代码(uniapp)

<template><view>姓名:<input type="text" v-model="name" />话语:<input type="text" v-model="text" /><button @click="onSumbit">发送</button></view>
</template>
<script>export default{data(){return{name:'',text:''}},onLoad() {this.getLink()},methods:{// 在页面或组件的方法中调用,初始化链接websocketgetLink(){uni.connectSocket({url: 'ws://127.0.0.1:3000',success() {console.log('WebSocket连接成功');},fail(err) {console.error('WebSocket连接失败', err);}});},// 收到信息getJieShouMessage(){uni.onSocketMessage(function (res) {console.log('收到消息:', res.data);});},// websocket发生了错误getErrorMessage(){uni.onSocketError(function (err) {console.error('WebSocket错误:', err);});},// websocket关闭getSocketGuanBi(){uni.onSocketClose(function () {console.log('WebSocket连接已关闭');});},// 如果不需要的话就关闭websocketgetCloseThisLiaotian(){uni.closeSocket({code: 1000,  // 关闭连接的状态码,可选reason: '用户关闭连接',  // 关闭连接的原因,可选success() {console.log('WebSocket连接已关闭');},fail(err) {console.error('WebSocket关闭失败', err);}});},// 这个是点击发送信息onSumbit(){var that = thislet values={name:this.name,context:this.text}uni.sendSocketMessage({data: JSON.stringify(values),success() {console.log('消息发送成功');that.getJieShouMessage()},fail(err) {console.error('消息发送失败', err);}});}}}
</script>

注意

getLink(){uni.connectSocket({url: 'ws://127.0.0.1:3000',success() {console.log('WebSocket连接成功');},fail(err) {console.error('WebSocket连接失败', err);}});},

这段代码中,需要初始化调用,进行链接websocket,url是ws协议,线上的地址需要wss协议,具体可以参考微信官方的wss协议要求,我这demo是微信小程序。

效果图

通过上图可以看见可以及时的收到信息,前端拿到信息进行渲染就可以完成websocket的及时通讯了。

http://www.lryc.cn/news/352525.html

相关文章:

  • 神经网络学习
  • CentOS部署NFS
  • JWT使用方法
  • 使用鱼香肉丝一键安装重新安装ROS后mavros节点报错,.so文件不匹配
  • STM32+CubeMX移植SPI协议驱动W25Q16FLash存储器
  • gpt-4o考场安排
  • 【Unity AR开发插件】四、制作热更数据-AR图片识别场景
  • Spring AOP的实操 + 原理(动态代理)
  • 16.线性回归代码实现
  • Java进阶学习笔记1——课程介绍
  • 【全开源】沃德商协会管理系统源码(FastAdmin+ThinkPHP+Uniapp)
  • python毕设项目选题汇总(全)
  • c#从数据库读取数据到datagridview
  • 训练YOLOv9-S(注意:官方还没有提供YOLOv9-S的网络,我这是根据网络博客进行的步骤,按照0.33、0.50比例调整网络大小,参数量15.60M,计算量67.7GFLOPs)
  • 视觉检测实战项目——九点标定
  • android git提交代码命令以及常见命令的使用
  • 类图的六大关系
  • 家政项目day2 需求分析(模拟入职后熟悉业务流程)
  • 面试总结之:socket线路切换
  • 002 递归评论 mongodb websocket消息推送
  • 高开高走的续作,可不止《庆余年2》
  • uniapp android使用uni.chooseLocation,app云打包后,定位地址列表一直在加载中
  • 详解http协议
  • 台湾省军事演习路径规划:A*算法在复杂地形中的应用
  • OpenHarmony鸿蒙软总线使用mbedtls数据加密详解
  • 【JavaEE】Servlet
  • SpringBoot——整合Redis
  • 2024全新Langchain大模型AI应用与多智能体实战开发
  • 【JavaEE 初阶(十)】JVM
  • 【Flutter】AspectRatio组件Card组件按钮组件Wrap组件