【发布时间】:2012-07-31 03:10:54
【问题描述】:
我必须实现一个应用程序,该应用程序每隔几秒钟就向服务器发送一次数据包,当服务器收到它们时,它会向客户端发送响应,然后客户端才会继续发送另一个数据包。这听起来不错,但我们使用的是 TCP,服务器收到数据包后立即响应,而不是后处理或类似的东西。所以这让我想知道,你为什么要做这样的事情?客户端有一个队列,我在其中保存所有数据包并执行以下操作:
try {
send packet // exception is thrown if connection is lost
remove packet from queue
} catch exception {
try to reconnect
}
所以在这种情况下,只有当 发送 成功时,数据包才会从队列中删除。
对此有任何想法吗?这是最佳实践吗?如果有人能帮我解决这个问题,我将不胜感激。
谢谢
【问题讨论】:
-
问:你的问题是什么? “解雇并忘记”(而不是维持队列)会更好吗?答:很有可能。使用 UDP 而不是 TCP 会更好(只要我们保留一个队列并可能管理重试)?答:很有可能。检测“发送”错误(没有某种“ACK”)有问题吗?答:是的。任何这些(潜在)问题的答案都是:“视情况而定”。 ;) 恕我直言...
-
TCP 保证传输和排序。因此使用 UDP,您可能会丢失排序,您必须自己进行重新发送、重新排序和分段。
-
如果你只需要知道连接是否正常,有一个选项叫 TCP_KEEPALIVE ,它会发送数据包以保持连接处于活动状态,如果丢失则超时。这自然不能保证说明另一端的软件正在运行,只是 TCP 连接还活着。
-
查询也是幂等的吗? IE。即使它们已经被处理而没有造成任何损坏,你可以重新发送它们吗?这将对您的设计产生影响。
-
我不完全确定服务器如何处理它们,但数据包有一个时间戳,不应该搞砸任何东西。
标签: tcp