websocket连接样例
This commit is contained in:
parent
424606b95c
commit
5edd47c1c9
|
|
@ -0,0 +1,210 @@
|
|||
<template>
|
||||
<div class="websocket-test">
|
||||
<h2>WebSocket 测试工具</h2>
|
||||
|
||||
<div class="connection-panel">
|
||||
<el-input v-model="userId" placeholder="输入用户ID" style="width: 200px"></el-input>
|
||||
<el-button type="primary" @click="connect" :disabled="isConnected">连接</el-button>
|
||||
<el-button type="danger" @click="disconnect" :disabled="!isConnected">断开</el-button>
|
||||
<el-button @click="sendPing" :disabled="!isConnected">发送心跳</el-button>
|
||||
<span class="status" :class="{ connected: isConnected }">
|
||||
{{ isConnected ? '已连接' : '未连接' }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="message-panel">
|
||||
<el-input v-model="messageToSend" placeholder="输入要发送的消息"
|
||||
style="width: 300px; margin-right: 10px"></el-input>
|
||||
<el-button type="primary" @click="sendMessage" :disabled="!isConnected">发送</el-button>
|
||||
</div>
|
||||
|
||||
<div class="log-panel">
|
||||
<h3>消息日志:</h3>
|
||||
<div class="log-content">
|
||||
<div v-for="(log, index) in logs" :key="index" class="log-item">
|
||||
<span class="log-time">[{{ log.time }}]</span>
|
||||
<span class="log-message">{{ log.message }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'WebSocketTest',
|
||||
data() {
|
||||
return {
|
||||
token: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NjI3MTg2MTUsInVzZXJuYW1lIjoiYWRtaW4ifQ.qSwjclSvEHOefAjm9Oqay9dmhLUZy1cgIBeE1u1Twg8',
|
||||
userId: 'test_user_' + Math.floor(Math.random() * 1000), // 随机用户ID
|
||||
ws: null,
|
||||
isConnected: false,
|
||||
messageToSend: '',
|
||||
logs: [],
|
||||
reconnectAttempts: 0,
|
||||
maxReconnectAttempts: 5,
|
||||
reconnectDelay: 5000 // 5秒重连间隔
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
connect() {
|
||||
if (this.isConnected) return
|
||||
|
||||
// WebSocket 连接地址
|
||||
const wsUrl = `ws://localhost:8091/nursing-unit_101/directive/websocket/${this.userId}?token=${this.token}`
|
||||
|
||||
this.ws = new WebSocket(wsUrl)
|
||||
|
||||
this.ws.onopen = () => {
|
||||
this.isConnected = true
|
||||
this.reconnectAttempts = 0
|
||||
this.addLog('连接成功')
|
||||
|
||||
// 启动心跳
|
||||
this.startHeartbeat()
|
||||
}
|
||||
|
||||
this.ws.onmessage = (event) => {
|
||||
const message = event.data
|
||||
this.addLog(`收到消息: ${message}`)
|
||||
|
||||
// 处理心跳响应
|
||||
if (message === 'pong') {
|
||||
this.addLog('收到心跳响应')
|
||||
}
|
||||
}
|
||||
|
||||
this.ws.onclose = () => {
|
||||
this.isConnected = false
|
||||
this.addLog('连接已关闭')
|
||||
|
||||
// 停止心跳
|
||||
this.stopHeartbeat()
|
||||
|
||||
// 自动重连
|
||||
if (this.reconnectAttempts < this.maxReconnectAttempts) {
|
||||
this.reconnectAttempts++
|
||||
this.addLog(`将在 ${this.reconnectDelay / 1000} 秒后尝试重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts})`)
|
||||
setTimeout(() => {
|
||||
this.connect()
|
||||
}, this.reconnectDelay)
|
||||
}
|
||||
}
|
||||
|
||||
this.ws.onerror = (error) => {
|
||||
this.addLog(`连接错误: ${error.message || '未知错误'}`)
|
||||
}
|
||||
},
|
||||
|
||||
disconnect() {
|
||||
if (this.ws) {
|
||||
this.ws.close()
|
||||
this.ws = null
|
||||
}
|
||||
this.isConnected = false
|
||||
this.stopHeartbeat()
|
||||
},
|
||||
|
||||
sendMessage() {
|
||||
if (this.ws && this.isConnected) {
|
||||
this.ws.send(this.messageToSend)
|
||||
this.addLog(`发送消息: ${this.messageToSend}`)
|
||||
this.messageToSend = ''
|
||||
}
|
||||
},
|
||||
|
||||
sendPing() {
|
||||
if (this.ws && this.isConnected) {
|
||||
this.ws.send('ping')
|
||||
this.addLog('发送心跳: ping')
|
||||
}
|
||||
},
|
||||
|
||||
startHeartbeat() {
|
||||
// 每30秒发送一次心跳
|
||||
this.heartbeatInterval = setInterval(() => {
|
||||
if (this.isConnected) {
|
||||
this.sendPing()
|
||||
}
|
||||
}, 30000)
|
||||
},
|
||||
|
||||
stopHeartbeat() {
|
||||
if (this.heartbeatInterval) {
|
||||
clearInterval(this.heartbeatInterval)
|
||||
this.heartbeatInterval = null
|
||||
}
|
||||
},
|
||||
|
||||
addLog(message) {
|
||||
const time = new Date().toLocaleTimeString()
|
||||
this.logs.unshift({ time, message })
|
||||
if (this.logs.length > 100) {
|
||||
this.logs.pop()
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
this.disconnect()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.websocket-test {
|
||||
padding: 20px;
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.connection-panel {
|
||||
margin-bottom: 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.status {
|
||||
margin-left: 10px;
|
||||
padding: 5px 10px;
|
||||
border-radius: 4px;
|
||||
background-color: #f56c6c;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.status.connected {
|
||||
background-color: #67c23a;
|
||||
}
|
||||
|
||||
.message-panel {
|
||||
margin-bottom: 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.log-panel {
|
||||
border: 1px solid #ebeef5;
|
||||
border-radius: 4px;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.log-content {
|
||||
max-height: 400px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.log-item {
|
||||
padding: 5px 0;
|
||||
border-bottom: 1px dashed #ebeef5;
|
||||
}
|
||||
|
||||
.log-time {
|
||||
color: #909399;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.log-message {
|
||||
word-break: break-all;
|
||||
}
|
||||
</style>
|
||||
Loading…
Reference in New Issue