我必须实现一个非常短的应用程序,每隔几秒就会向服务器发送一个数据包,当服务器接收到它时,它会向客户端发送一个响应,然后才开始发送另一个数据包。这听起来很不错,但是我们使用的是TCP,一旦服务器收到数据包而没有后处理或类似的东西,就会收到响应。所以这让我想知道,为什么你会这样做?客户端有一个队列,我保留了所有数据包并执行了类似的操作:
try {
send packet // exception is thrown if connection is lost
remove packet from queue
} catch exception {
try to reconnect
}
所以在这种情况下,仅当发送成功时才会从队列中删除数据包。
对此有何想法?这是最佳做法吗?如果有人能为我清楚这一点,我将不胜感激。
由于
答案 0 :(得分:1)
在某些情况下,发送不够。如果绝对关键的是必须收到您要推出的数据,那么您应该等待确认该数据包是由远程端接收/处理的。
即使网络级别的内容工作正常且数据包到达目的地,该目标计算机仍可能崩溃或以其他方式丢失数据。如果您删除发送,那么该数据就消失了。等待来自远程端的确认至少可以让您重新发送已损坏/丢失的数据包。
答案 1 :(得分:1)
一种选择是将数据包放入队列并发送它们。发送后将它们移动到“待定”队列中。一旦另一端处理它们,您就将它们标记为已完成。然后你就会遇到其他问题。如果另一端处理它们但是ack永远不会到达你的目的怎么办?这是一个相对研究的问题,我建议你研究分布式事务和两阶段提交,如果你需要确定。