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:{
			// 在页面或组件的方法中调用,初始化链接websocket
			getLink(){
				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连接已关闭');
				});
			},
			// 如果不需要的话就关闭websocket
			getCloseThisLiaotian(){
				uni.closeSocket({
				  code: 1000,  // 关闭连接的状态码,可选
				  reason: '用户关闭连接',  // 关闭连接的原因,可选
				  success() {
				    console.log('WebSocket连接已关闭');
				  },
				  fail(err) {
				    console.error('WebSocket关闭失败', err);
				  }
				});
			},
			// 这个是点击发送信息
			onSumbit(){
				var that = this
				let 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的及时通讯了。

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。Uniapp 是一种跨平台的应用开发框架,能够使用一份代码同时在不同的移动端应用平台运行。因此,在使用 Node.js 和 Uniapp 开发直播系统时,你可以使用 Node.js 来搭建后端服务器,使用 Uniapp 来开发直播应用的前端界面。 ### 回答2: Node.js和Uniapp是两种不同的技术,可以结合使用来构建直播系统。 Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它可以在服务器端运行JavaScript代码。在搭建直播系统时,可以使用Node.js来处理服务器端的逻辑和数据传输,例如实现直播流的推送和拉取、用户认证和权限控制等功能。Node.js提供了丰富的模块和工具,使得直播系统的开发更加方便和高效。 Uniapp是一个跨平台的应用开发框架,通过使用一套代码可以同时开发iOS、Android和Web应用。在直播系统中,可以使用Uniapp来构建前端用户界面,实现直播间的展示、直播间搜索、用户登录和账户管理等功能。Uniapp使用了Vue.js作为其核心框架,开发者可以利用Vue.js的优秀特性和丰富的生态系统来快速构建直播系统的前端界面。 通过结合使用Node.js和Uniapp,可以实现完整的直播系统。Node.js负责处理服务器端的逻辑和数据传输,Uniapp负责构建用户界面,并通过与Node.js进行通信来获取数据和操作服务器。这样可以使得直播系统具有良好的实时性和可扩展性,同时又能够提供跨平台的用户体验。 总结起来,Node.js和Uniapp可以配合使用,使得直播系统的开发更加高效,同时能够提供良好的用户体验和可扩展性。通过这种组合,可以构建出功能强大、稳定可靠的直播系统。 ### 回答3: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,可以用于构建高效的网络应用程序。而 Uniapp 是一款跨平台的开发框架,可以快速开发同时支持多个平台(如小程序、手机 App、H5 等)的应用程序。 直播系统是一种通过网络实时传输音频和视频数据的应用方式,它可以让用户实时观看和参与到正在发生的事件中。在构建 Node.js 和 Uniapp 结合的直播系统时,可以借助 Node.js 的强大后端能力以及 Uniapp 的跨平台特性,实现一个功能完善的直播应用。 首先,在后端使用 Node.js 可以搭建一个强大的服务器,处理直播系统的后台逻辑。这个服务器可以实现用户注册登录、创建直播间、上传/下载直播视频、管理用户权限等功能。Node.js 的事件驱动和非阻塞 I/O 特性可以保证服务器在高并发场景下的稳定性和流畅性。 然后,利用 Uniapp 跨平台的特性,可以快速开发直播系统的前端界面。Uniapp 可以将代码编译成小程序、App 或者 H5 页面,并且支持多种前端框架(如 Vue、React 等)。通过 Uniapp,可以方便地实现用户界面的交互、实时聊天、弹幕、礼物赠送等功能,提升用户体验。 最后,Node.js 和 Uniapp 的结合还可以实现实时推流和播放的功能。通过 Node.js 的实时通信技术,可以将用户上传的音/视频数据实时推送给观众端,实现直播的实时性。同时,Uniapp 支持音/视频播放的组件,可以实现观众端对直播音/视频的实时播放。 综上所述,利用 Node.js 和 Uniapp 结合起来开发直播系统,可以充分发挥它们各自的优势,实现高效稳定的后端逻辑和跨平台的前端界面,为用户提供一个功能完善、流畅稳定的直播应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦逼的猿宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值