更新长连接功能
This commit is contained in:
parent
e8bbfe5a8c
commit
1137e2d1b3
|
@ -59,7 +59,7 @@ export default function SpaceRefund() {
|
||||||
if (isSubmitting) return;
|
if (isSubmitting) return;
|
||||||
setIsSubmitting(true);
|
setIsSubmitting(true);
|
||||||
try {
|
try {
|
||||||
const _data = await requireAPI("POST", "/api/zone/refund_v2", {
|
const _data = await requireAPI("POST", "/api/zone/refund", {
|
||||||
body: {
|
body: {
|
||||||
zid: Number(searchParams.get("id")),
|
zid: Number(searchParams.get("id")),
|
||||||
contact_name: name,
|
contact_name: name,
|
||||||
|
|
|
@ -10,86 +10,28 @@ const WebSocketComponent = ({ getData, authInfo }) => {
|
||||||
const [messages, setMessages] = useState([]);
|
const [messages, setMessages] = useState([]);
|
||||||
// const [pending, startTransition] = useTransition();
|
// const [pending, startTransition] = useTransition();
|
||||||
const socketRef = useRef(null);
|
const socketRef = useRef(null);
|
||||||
|
let interval = null;
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let interval = null;
|
|
||||||
const account = get("account");
|
const account = get("account");
|
||||||
function connect_socket() {
|
|
||||||
const base = baseRequest();
|
|
||||||
|
|
||||||
if (socketRef.current && socketRef.current.readyState === 1) return;
|
|
||||||
// 创建WebSocket连接
|
|
||||||
if (!socketRef.current && account)
|
|
||||||
socketRef.current = new WebSocket(
|
|
||||||
`${process.env.NEXT_PUBLIC_WEBSOCKET_URL}/ws?b_mid=${base.b_mid}&b_dt=1&b_token=${base.b_token}&b-ch=h5`
|
|
||||||
);
|
|
||||||
|
|
||||||
// 响应服务器的 ping
|
|
||||||
// socketRef.current.on("ping", () => {
|
|
||||||
// socketRef.current.send("pong");
|
|
||||||
// });
|
|
||||||
}
|
|
||||||
if (!account && socketRef.current) {
|
if (!account && socketRef.current) {
|
||||||
socketRef.current.close();
|
socketRef.current.close();
|
||||||
socketRef.current = null;
|
socketRef.current = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
connect_socket();
|
if (!socketRef.current && account) {
|
||||||
if (socketRef.current) {
|
retryInterval = Math.min(retryInterval * 2, maxInterval);
|
||||||
// 注意使用wss协议(如果服务器支持)
|
const timer = setInterval(() => {
|
||||||
// 连接打开时触发
|
if (socketRef.current?.readyState !== 1) {
|
||||||
socketRef.current.onopen = () => {
|
if (socketRef.current) {
|
||||||
// console.log("WebSocket connected.", socketRef.current.readyState);
|
socketRef.current?.close();
|
||||||
// 可以在这里发送消息到服务器,例如:socket.send('Hello Server!');
|
socketRef.current = null;
|
||||||
retryInterval = 1000;
|
clearInterval(interval);
|
||||||
sendMessageQueue();
|
}
|
||||||
socketRef.current.send(JSON.stringify({ t: 1 }));
|
connect_socket();
|
||||||
};
|
|
||||||
// 处理收到的消息
|
|
||||||
socketRef.current.onmessage = (event) => {
|
|
||||||
if (Object.prototype.toString.call(event.data) === "[object Blob]") {
|
|
||||||
var reader = new FileReader();
|
|
||||||
reader.readAsText(event.data, "utf-8");
|
|
||||||
reader.onload = function (e) {
|
|
||||||
if (reader.result === "pong") {
|
|
||||||
console.log("pong received");
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const data = JSON.parse(reader.result);
|
|
||||||
|
|
||||||
if (data.t === 2 && data.msg.ping_interval) {
|
|
||||||
socketRef.current.send("ping");
|
|
||||||
interval = setInterval(() => {
|
|
||||||
// 发送 ping 给服务器
|
|
||||||
socketRef.current.send("ping");
|
|
||||||
// 响应服务器的 ping
|
|
||||||
// socketRef.current.on("ping", () => {
|
|
||||||
// socketRef.current.send("pong");
|
|
||||||
// });
|
|
||||||
}, data.msg.ping_interval * 1000);
|
|
||||||
}
|
|
||||||
if (data.t === 3) {
|
|
||||||
getData(data.msg);
|
|
||||||
setMessages((prevMessages) => [...prevMessages, data]);
|
|
||||||
}
|
|
||||||
} catch (error) {}
|
|
||||||
};
|
|
||||||
} else {
|
} else {
|
||||||
|
clearInterval(timer);
|
||||||
}
|
}
|
||||||
};
|
}, retryInterval);
|
||||||
|
|
||||||
// 连接关闭时触发
|
|
||||||
socketRef.current.onclose = () => {
|
|
||||||
clearInterval(interval);
|
|
||||||
setTimeout(connect_socket, 1000);
|
|
||||||
retryInterval = Math.min(retryInterval * 2, maxInterval);
|
|
||||||
// console.log("WebSocket disconnected.");
|
|
||||||
};
|
|
||||||
// 连接错误时触发
|
|
||||||
socketRef.current.onerror = (error) => {
|
|
||||||
// console.error("WebSocket error:", error);
|
|
||||||
// 重新连接
|
|
||||||
socketRef.current?.close();
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
// 组件卸载时关闭WebSocket连接
|
// 组件卸载时关闭WebSocket连接
|
||||||
return () => {
|
return () => {
|
||||||
|
@ -102,10 +44,86 @@ const WebSocketComponent = ({ getData, authInfo }) => {
|
||||||
}, [authInfo]); // 空依赖数组表示这个effect只在组件挂载时运行一次
|
}, [authInfo]); // 空依赖数组表示这个effect只在组件挂载时运行一次
|
||||||
// return <Error statusCode={500} />;
|
// return <Error statusCode={500} />;
|
||||||
|
|
||||||
|
const connect_socket = () => {
|
||||||
|
const base = baseRequest();
|
||||||
|
const account = get("account");
|
||||||
|
if (socketRef.current?.readyState === 1) return;
|
||||||
|
// 创建WebSocket连接
|
||||||
|
console.log("desdas--------.", account);
|
||||||
|
socketRef.current = new WebSocket(
|
||||||
|
`${process.env.NEXT_PUBLIC_WEBSOCKET_URL}/ws?b_mid=${base.b_mid}&b_dt=1&b_token=${base.b_token}&b-ch=h5`
|
||||||
|
);
|
||||||
|
|
||||||
|
// 注意使用wss协议(如果服务器支持)
|
||||||
|
// 连接打开时触发
|
||||||
|
socketRef.current.onopen = () => {
|
||||||
|
// console.log("WebSocket connected.", socketRef.current.readyState);
|
||||||
|
// 可以在这里发送消息到服务器,例如:socket.send('Hello Server!');
|
||||||
|
retryInterval = 1000;
|
||||||
|
sendMessageQueue();
|
||||||
|
socketRef.current.send(JSON.stringify({ t: 1 }));
|
||||||
|
};
|
||||||
|
// 处理收到的消息
|
||||||
|
socketRef.current.onmessage = (event) => {
|
||||||
|
if (Object.prototype.toString.call(event.data) === "[object Blob]") {
|
||||||
|
var reader = new FileReader();
|
||||||
|
reader.readAsText(event.data, "utf-8");
|
||||||
|
reader.onload = function (e) {
|
||||||
|
if (reader.result === "pong") {
|
||||||
|
console.log("pong received");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const data = JSON.parse(reader.result);
|
||||||
|
|
||||||
|
if (data.t === 2 && data.msg.ping_interval) {
|
||||||
|
socketRef.current.send("ping");
|
||||||
|
interval = setInterval(() => {
|
||||||
|
// 发送 ping 给服务器
|
||||||
|
socketRef.current.send("ping");
|
||||||
|
// 响应服务器的 ping
|
||||||
|
// socketRef.current.on("ping", () => {
|
||||||
|
// socketRef.current.send("pong");
|
||||||
|
// });
|
||||||
|
}, data.msg.ping_interval * 1000);
|
||||||
|
}
|
||||||
|
if (data.t === 3) {
|
||||||
|
getData(data.msg);
|
||||||
|
setMessages((prevMessages) => [...prevMessages, data]);
|
||||||
|
}
|
||||||
|
} catch (error) {}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 连接关闭时触发
|
||||||
|
socketRef.current.onclose = () => {
|
||||||
|
console.log("WebSocket closed.", socketRef.current.readyState);
|
||||||
|
clearInterval(interval);
|
||||||
|
|
||||||
|
if (account) {
|
||||||
|
console.log("WebSocket closed--------.", account);
|
||||||
|
setTimeout(connect_socket, 1000);
|
||||||
|
// retryInterval = Math.min(retryInterval * 2, maxInterval);
|
||||||
|
}
|
||||||
|
|
||||||
|
// console.log("WebSocket disconnected.");
|
||||||
|
};
|
||||||
|
// 连接错误时触发
|
||||||
|
socketRef.current.onerror = (error) => {
|
||||||
|
// console.error("WebSocket error:", error);
|
||||||
|
// 重新连接
|
||||||
|
socketRef.current?.close();
|
||||||
|
};
|
||||||
|
// 响应服务器的 ping
|
||||||
|
// socketRef.current.on("ping", () => {
|
||||||
|
// socketRef.current.send("pong");
|
||||||
|
// });
|
||||||
|
};
|
||||||
const sendMessageQueue = () => {
|
const sendMessageQueue = () => {
|
||||||
while (messageQueue.length > 0) {
|
while (messageQueue.length > 0) {
|
||||||
const data = messageQueue.shift(); // 获取并移除队列中的第一个元素
|
const data = messageQueue.shift(); // 获取并移除队列中的第一个元素
|
||||||
sendMessage(data); // 尝试再次发送
|
// sendMessage(data); // 尝试再次发送
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
|
|
Loading…
Reference in New Issue