我正在寻找建议,以解决我通过套接字发送消息时遇到的问题的最佳方法。我需要确保保留消息发送的顺序,即先进先出,即使我无法保证套接字始终打开。
我的程序中有一个网络管理器,有一个发送方法。此send方法接受一个消息对象,然后尝试通过套接字将其推出。
但是,由于网络连接丢失,有时套接字将被关闭,我需要在等待套接字重新打开时停止发送消息并排队任何新消息。当套接字重新打开时,应按顺序发送排队的消息。
我正在使用Javascript和Websockets。我现在有类似的东西,但似乎有缺陷:
function send(msg) {
if (msg) {
outbox.push(msg);
}
if (!readyState) {
return setTimeout(send, 100);
}
while (outbox.length) {
socket.send(outbox.shift());
}
}
有没有人曾经解决过这样的问题?我正在寻找构建程序的一般方法,或者可能使用的算法。
答案 0 :(得分:2)
亚当。这是一个稍微完整的答案。如果我是你,我会把它包装在一个连接对象中。
function send(msg) {
if (msg) {
if (socket.readyState === socket.OPEN) {
socket.send(msg);
} else {
outbox.push(msg);
}
}
}
socket.onopen = function() {
while(outbox.length) {
socket.send(outbox.shift());
}
}
答案 1 :(得分:0)
就结构而言,你只是在问一般吗?
你有没有想过用push()pop()shift()和unshift()来使用逻辑?
基本上在某种类型的套接字错误回调中,将消息推送到堆栈中。当可以打开套接字或者您想尝试再次按下消息时,可以将()正确的对象移出。您可以使用它们的任何组合来获得正确的消息排序。