我正在收听一个服务器,它通过序列号向我发送某些消息。我的客户端解析序列号,以便跟踪我们是否得到重复或者是否错过序列号,尽管它通常由包装器对象调用,该包装器对象需要单个增量序列号。不幸的是,这个特定的服务器发送不同的序列号流,仅在每个子流内增量。换句话说,一个更简单的服务器会发送给我:
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。
我很难找到一种创造这种行为的方法。有什么方法可以解决这个问题?
答案 0 :(得分: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)