通过套接字的连续数据流逐渐延迟

时间:2013-01-29 23:06:47

标签: sockets

我正在开发一个应用程序,它通过Java程序链接两个不同的机器人模拟环境。一个模拟环境(我们称之为A)将机器人的当前状态发送到Java应用程序,Java应用程序进行一些计算,然后将有关此当前状态的数据以及一些其他信息发送到另一个模拟环境(让我们调用)它B)。模拟B然后更新机器人的状态以匹配模拟A的版本。

问题是随着程序继续运行,模拟B开始落后于模拟A正在做的事情。这种滞后不断增加,因此在一分钟左右后,模拟B落后几秒钟。

我正在使用TCP套接字在这些环境和Java程序之间发送数据。从插件编程的背景阅读中,我发现连续快速打开和关闭套接字是不好的做法,所以我目前正在做的只是保持两个套接字都打开。我有一个循环运行,它从Sim A抓取数据,进行一些计算,然后将位置数据发送到Sim B然后我让线程等待100ms,然后循环重复。需要说明的是,发送给B的位置数据与从A收到的数据不同。

在研究滞后问题时,有人向我建议,对于数据流来说,打开和关闭套接字实际上是一个好主意,因为如果你保持套接字打开,如果一个模拟需要更长的时间来处理事情而不是另外,最终将位置数据堆叠在缓冲区中并按顺序读取,而不是读取最新数据。这是真的?是否会重写我的代码以每隔100毫秒打开和关闭套接字可能会消除延迟?或者这不是套接字实际上如何工作?

编辑以澄清:模拟保持同步比发送所有位置数据更为关键,换句话说,为了保持同步而不传递所有数据点是可以接受的。

除了保持套接字打开导致问题之外,是否有人对可能导致滞后问题的原因有任何想法?

提前感谢任何见解/建议/提示!

1 个答案:

答案 0 :(得分:0)

您使用单一连接是正确的。数据确实可以备份,但使用多个连接不会改变它。

这里的基本问题是Java程序是否可以像机器人发送数据一样快速地计算。如果它不能,它将落后。你可以为网络做各种事情以加快速度,但如果计算无法跟上,那么它们是徒劳的。所以你需要调查你的时间。