0

ソケットを介してメッセージを送信する際に発生する問題を解決する最善の方法についてアドバイスを求めています。ソケットが常に開いていることを保証できない場合でも、メッセージが送信される順序、つまり先入れ先出しを確実に保持する必要があります。

私のプログラムには send メソッドを持つネットワークマネージャーがあります。この send メソッドは、メッセージ オブジェクトを受け取り、それをソケット経由でプッシュしようとします。

ただし、ネットワーク接続が失われたためにソケットが閉じられることがあり、メッセージの送信を停止し、ソケットが再開するのを待っている間、新しいメッセージをキューに入れる必要があります。ソケットが再び開くと、キューに入れられたメッセージが順番に送信されます。

私は 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() します。ソケットを開くことができる場合、またはメッセージを再度プッシュしようとする場合は、正しいオブジェクトを shift() できます。メッセージの正しい順序を得るために、それらの任意の組み合わせを使用できます。

于 2013-08-07T17:10:11.673 に答える