一、websocket是什么
是一种基于TCP协议的网络通信技术,它提供了一个持久的、全双工的通信通道,可以在客户端和服务器之间进行实时的双向通信。
特点:WebSocket允许服务器主动向客户端推送数据,而不需要客户端发送请求。这种实时通信的特性使得WebSocket非常适合在Web应用中实现实时消息推送、实时数据更新等功能。
二、前后端交互的方式
-
拉
客户端ajax请求等等; -
推
服务器主动向客户端推送消息 -
轮询
客户端定时向服务器发送请求,服务器 接到请求后马上返回响应信息并关闭连接 -
长连接
客户端与服务器保持不间断的连接;
三、使用koa2结合 socket.io:socket.io是对websocket的封装,用于客户端与服务端的相互通讯
(聊天室的例子:服务器主动向客户端推送消息)
后端
1.安装socket.io
npm install socket.io --save
在index.js 入口文件导入
const Koa = require('koa');
const cors = require('koa2-cors');
const server = require('http').Server(app.callback())
const io = require('socket.io')(server, {cors: true})
const { handleChatRoom } =require('./modules/chatRoomSocket.js') // 导入模块
handleChatRoom(io) //调用handleChatRoom方法传io
//监听端口
server.listen(3006, () => {
console.log('socket server run at 3006')
})
2.chatRoomSocket.js 模块文章来源:https://www.toymoban.com/news/detail-651544.html
const { doSQL, getOne } = require('../utils/database')
const save = async (form) => {
const sql = 'insert into chat_room (name, avatar, gender, content) values (?,?,?,?)'
const res = await doSQL(sql, [form.name, form.avatar, form.gender, form.content])
// console.log(res)
}
const getList = async () => {
const sql = 'select * from chat_room order by id'
const res = await doSQL(sql)
return res
}
const handleChatRoom = (io) => {
io.on('connection', async (socket) => { //客户端与服务端建立连接
console.log('socket 初始化成功')
socket.emit('get-list', await getList())
socket.on('send-message', async (data) => {
console.log(data)
await save(data)
//给所有的客户端广播消息
io.sockets.emit('get-list', await getList())
})
})
}
module.exports = {
handleChatRoom
}
//给出了自己外的客户端广播消息
//client.broadcast.emit('message',value)
前端
1.安装依赖文章来源地址https://www.toymoban.com/news/detail-651544.html
npm install socket.io-client --save
<script setup lang="ts">
import { ref, onMounted, watch, nextTick } from 'vue'
import io from 'socket.io-client'
let socket
const list = ref([])
const box = ref()
const form = ref({
content : '',
name:'mil',
avatar:'test.png',
gender:0
})
// 监听 渲染页面的数组
watch(list.value,()=>{
scrollBottom()
})
onMounted(()=>{
socket= io('http://localhost:3006')
socket.on('connect' , () =>{
console.log(socket.id,'监听客户端成功');
})
socket.on('get-list',(data) => {
list.value = data
scrollBottom()
})
})
//滚动条保持在底部
const scrollBottom = () => {
nextTick(()=>{
box.value.scrollTop = box.value.scrollHeight
})
}
const send = ()=> {
socket.emit('send-message',form.value)
form.value.content=''
}
</script>
<template>
<h2>聊天室</h2>
<div class="list" ref="box">
<ul>
<li v-for="item in list">{{item.content}}</li>
</ul>
</div>
<div class="footer">
<textarea class="message" v-model="form.content"></textarea>
<button @click="send">发送</button>
</div>
</template>
<style scoped>
.list {
border: 1px solid #ccc;
height: 200px;
overflow-y: auto;
}
.list > ul {
display: flex;
flex-direction: column-reverse;
}
.footer {
display: flex;
margin-top: 10px;
height: 100px;
}
.footer textarea {
outline: none;
}
.footer button {
width: 100px;
}
.message {
flex-grow: 1;
}
</style>
到了这里,关于利用Websocket进行前后端通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!