2

我正在收听一个服务器,该服务器使用序列号向我发送某些消息。我的客户解析出序列号以跟踪我们是否得到重复或是否错过了序列号,尽管它通常由一个需要单个递增序列号的包装器对象调用。不幸的是,这个特定的服务器发送不同的序列号流,仅在每个子流中递增。换句话说,一个更简单的服务器会发送给我:

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。

不过,我很难找到一种方法来创建这种行为。有哪些方法可以解决?

4

1 回答 1

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)
于 2013-01-10T23:58:35.600 回答