2013-08-07 3 views
0

Я ищу совет относительно наилучшего способа решения проблемы, с которой я столкнулся, при отправке сообщений через сокет. Мне нужно следить за тем, чтобы заказ был отправлен, то есть сначала в первый раз, даже если я не могу гарантировать, что сокет всегда открыт.Как обеспечить порядок исходящих сообщений

У меня есть менеджер сети в моей программе с методом отправки. Этот метод отправки принимает объект сообщения, а затем пытается вытолкнуть его через сокет.

Однако иногда сокет будет закрыт из-за потери сетевого подключения, и мне нужно прекратить отправлять сообщения и размещать в очереди новые сообщения, пока я жду, пока сокет снова откроется. Когда сокет снова открывается, сообщения в очереди должны быть отправлены по порядку.

Я работаю с Javascript и Websockets. У меня есть что-то вроде этого прямо сейчас, но мне кажется ошибочным:

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

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

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

Кто-нибудь когда-либо решать проблему, как это раньше? Я ищу общий подход к структурированию программы или, возможно, алгоритм, который можно использовать.

+2

Ваш заказ должен быть правильным. Не используйте 'setTimeout'. Вместо этого свяжите что-то вроде 'retryAll()' с обратным вызовом 'onopen' websocket, а затем внутри функции' retryAll() 'do' while (oubox.length) {socket.send ... ' – vin

+0

@vin это отличный ответ. Добавьте его в список ответов! – Adam

ответ

2

Adam. Вот несколько более полный ответ. Если бы я был вами, я бы обернул это в объект соединения.

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()); 
    } 
} 
0

Вы просто спрашиваете, насколько структурированы?

Вы думали использовать логику с помощью push() pop() shift() и unshift()?

По существу в случае обратного вызова ошибки сокета, push() сообщения в стек. Когда сокет можно открыть или вы хотите снова нажать сообщения, вы можете сдвинуть() нужный объект. Вы можете использовать любую комбинацию для правильного упорядочивания сообщений.

Смежные вопросы