增加ack确认消息机制

This commit is contained in:
2026-09-23 15:45:13 +08:00
parent 41354a3090
commit 761b7da0fc
+38 -20
View File
@@ -231,8 +231,7 @@ import {
import { import {
connectWebSocket, connectWebSocket,
sendWebSocketMessage, sendWebSocketMessage,
closeWebSocket, closeWebSocket
// getWebSocket
} from "@/utils/websocket"; } from "@/utils/websocket";
export default { export default {
@@ -418,6 +417,7 @@ export default {
// 新消息 // 新消息
const newMessage = { const newMessage = {
type: "sendMessage", type: "sendMessage",
messageId: Date.now() + "-" + Math.random().toString(36).slice(2),
senderName: this.currentUser.username, senderName: this.currentUser.username,
receiverName: this.currentContact.contactName, receiverName: this.currentContact.contactName,
content: content, content: content,
@@ -429,6 +429,7 @@ export default {
this.contactMessages.push({ this.contactMessages.push({
...newMessage, ...newMessage,
from: "me", from: "me",
createdAt: newMessage.createdAt,
time: newMessage.createdAt, time: newMessage.createdAt,
}); });
@@ -439,6 +440,7 @@ export default {
newMessage newMessage
); );
console.log("contactMessages:" + this.contactMessages); console.log("contactMessages:" + this.contactMessages);
// 清空输入框 // 清空输入框
this.messageText = ""; this.messageText = "";
this.$nextTick(() => { this.$nextTick(() => {
@@ -486,8 +488,10 @@ export default {
} }
}, },
// 监听websocket连接成功事件
websocketOnOpen() {}, websocketOnOpen() {},
// 监听websocket接收消息事件
websocketOnMessage(data) { websocketOnMessage(data) {
// 格式如下: // 格式如下:
// { // {
@@ -501,37 +505,51 @@ export default {
// } // }
// } // }
if (data.type !== "newMessage") { // 当接收到新消息的时候,对消息显示进行处理,同时需要给websocket回一个ack确认收到的消息
return; if (data.type == "newMessage") {
} const message = data.message;
const senderName = message.senderName;
const message = data.message; const currentContactName =
const senderName = message.senderName; this.currentContact && this.currentContact.contactName;
const currentContactName = // 是当前聊天联系人
this.currentContact && this.currentContact.contactName; if (senderName === currentContactName) {
this.contactMessages.push({
...message,
from: "other",
time: message.createdAt,
});
} else {
// 不是当前联系人,不加入 contactMessages,只更新最近聊天列表、未读数量
this.updateRecentChat("receive", senderName, message);
}
// 是当前聊天联系人 // 返回 ACK
if (senderName === currentContactName) { sendWebSocketMessage({
this.contactMessages.push({ type: "ack",
...message, messageId: message.messageId
from: "other", });
time: message.createdAt, this.$nextTick(() => {
this.scrollToBottom();
});
} else if (data.type == "sendError") {
this.$message.error("发送失败,请重试");
this.$nextTick(() => {
this.scrollToBottom();
}); });
} else { } else {
// 不是当前联系人,不加入 contactMessages,只更新最近聊天列表、未读数量 return;
this.updateRecentChat("receive", senderName, message);
} }
this.$nextTick(() => {
this.scrollToBottom();
});
}, },
// 监听websocket连接报错事件
websocketOnErr() { websocketOnErr() {
this.$message.error("网络连接失败,请重试"); this.$message.error("网络连接失败,请重试");
this.logout(); this.logout();
}, },
// 创建websocket
createWebsocket() { createWebsocket() {
const token = this.$store.state.token; const token = this.$store.state.token;
const jwtToken = token.replace("Bearer ", ""); const jwtToken = token.replace("Bearer ", "");