0

我正在寻找有关解决通过套接字发送消息时遇到的问题的最佳方法的建议。我需要确保保留消息发送的顺序,即先进先出,即使我不能保证套接字始终打开。

我的程序中有一个网络管理器,带有一个发送方法。此发送方法接受一个消息对象,然后尝试通过套接字将其推出。

但是,有时由于失去网络连接,套接字会关闭,我需要在等待套接字重新打开时停止发送消息并将任何新消息排队。当套接字重新打开时,排队的消息应该按顺序发送。

我正在使用 Javascript 和 Websockets。我现在有这样的东西,但它似乎有缺陷:

function send(msg) {
    if (msg) {
        outbox.push(msg);
    }

    if (!readyState) {
        return setTimeout(send, 100);
    }

    while (outbox.length) {
        socket.send(outbox.shift());
    }
}

以前有没有人解决过这样的问题?我正在寻找一种构建程序的通用方法,或者可能是一种可以使用的算法。

4

2 回答 2

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());
   }
}
于 2013-08-07T17:51:45.073 回答
0

您只是在一般情况下询问结构吗?

你有没有想过将逻辑与 push() pop() shift() 和 unshift() 一起使用?

基本上在某种套接字错误回调中,将消息 push() 到堆栈中。当套接字可以打开或者您想再次尝试推送消息时,您可以将正确的对象移出。您可以使用它们的任何组合来获得正确的消息顺序。

于 2013-08-07T17:10:11.673 回答