Как сжать поток увеличивающихся порядковых номеров до одного?

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

1,2,3,4,5,7

и я бы просто отчитался 1,2,3,4,5,6,7, а инструмент-оболочка уведомил бы о потере одного сообщения. К сожалению, этот более сложный сервер отправляет мне что-то вроде:

A1,A2,A3,B1,B2,A4,C1,A5,A7

(за исключением того, что буквы на самом деле также являются числовыми кодами, что удобно). Вышеупомянутое не имеет пробелов, кроме A6, но поскольку мне нужно сообщить одно число объекту-оболочке, я не могу сообщить:

1,2,3,1,2,4,1,5,7

потому что это будет интерпретировано неправильно. Таким образом, я хочу сжать в своем клиенте то, что я получаю, в один добавочный поток чисел. Пример

A1,A2,A3,B1,B2,A4,C1,A5,A7

должно действительно переводиться примерно так:

1,2,3,4 (поскольку B1 действительно является 4-м уникальным сообщением), 5, 6, 7, 8, 10 (поскольку 9 может быть A6, B3, C2 или другой буквой-1)

тогда это будет воспринято как пропущенное одно сообщение (A6). Другой пример последовательности:

A1,A2,B1,A7,C1,A8

можно сообщить как:

1,2,3,8,9,10

потому что первые три логически находятся в правильной последовательности, ничего не пропущено. Затем мы получаем A7, и это означает, что мы пропустили 4 сообщения (A3, A4, A5 и A6), поэтому я сообщаю о 8, чтобы обертка могла сказать. Затем приходит C1, и это нормально, поэтому я ставлю ему #9, а затем A8 теперь является следующим ожидаемым A, поэтому я ставлю ему 10.

Однако мне трудно найти способ создать такое поведение. Как это сделать?


person Palace Chan    schedule 10.01.2013    source источник
comment
Стартовые номера одинаковые? Иначе 1,2,3,4,5,6,7 могут быть двумя последовательностями (1,2,3) и (4,5,6,7)   -  person user1952500    schedule 11.01.2013
comment
Да они все начинаются с 1   -  person Palace Chan    schedule 11.01.2013


Ответы (1)


Для каждого потока убедитесь, что этот поток имеет правильную последовательность. Затем выведите количество всех действительных порядковых номеров, которые вы видели, как совокупный. Псевдокод:

function initialize()
    for stream in streams do
        stream = 0
    aggregateSeqno = 0

function process(streamId, seqno)
   if seqno = streams[streamId] then
      streams[streamId] = seqno + 1
      aggregateSeqno = aggregateSeqno + 1
      return aggregateSeqno
   else then
      try to fix streams[streamId] by replying to the server

function main()
   initialize()
   while(server not finished) do
      (streamId, seqno) = receive()
      process(streamId, seqno)
person Patrick87    schedule 10.01.2013