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

Sockets 通过套接字的连续数据流逐渐延迟,sockets,Sockets,我正在开发一个应用程序,它通过一个Java程序连接两个不同的机器人模拟环境。一个模拟环境,我们称之为A,它将机器人的当前状态发送到Java应用程序,Java应用程序进行一些计算,然后发送关于当前状态的数据以及一些其他信息,在另一个模拟环境中,我们称之为B。然后,模拟B更新机器人的状态,以匹配模拟A的版本 问题是,随着程序继续运行,模拟B开始落后于模拟A所做的工作。该滞后持续增加,因此在大约一分钟后,模拟B落后几秒 我使用TCP套接字在这些环境和Java程序之间发送数据。通过对socket编程的背

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

问题是,随着程序继续运行,模拟B开始落后于模拟A所做的工作。该滞后持续增加,因此在大约一分钟后,模拟B落后几秒

我使用TCP套接字在这些环境和Java程序之间发送数据。通过对socket编程的背景阅读,我发现持续快速地打开和关闭socket是一种不好的做法,所以我目前所做的只是保持两个socket都打开。我运行了一个循环,从Sim卡a获取数据,进行一些计算,然后将位置数据发送到Sim卡B,然后让线程等待100毫秒,然后循环重复。要明确的是,发送到B的位置数据与从A接收到的位置数据没有变化

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

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

除了保持套接字打开会导致问题外,是否有人知道是什么导致了延迟问题


提前感谢您提供的任何见解/建议/提示

使用单个连接是正确的。数据确实可以备份,但使用多个连接并不能改变这一点


这里的基本问题是Java程序的计算速度是否与机器人发送数据的速度一样快。如果不能,它就会落后。你可以对网络做各种各样的事情来加速它,但是如果计算不能跟上,那么它们是徒劳的。因此,您需要调查您的时间安排。

最重要的信息是:您使用的是TCP还是UDP?哎呀,应该提到这一点!我正在使用TCP套接字。我编辑我的帖子就是为了反映这一点。我不确定我是否理解为什么使用多个连接可能无法解决数据备份问题。如果我开始关闭连接,堆叠的所有数据不是都会被抛出,然后当套接字再次打开时,会发送一个最新的位置吗?由于计算java部分中的内容所需的时间,在传输数据时可能仍然存在一些延迟,但这种延迟不应再累积,并且随着时间的推移而变得更严重。无论如何,我都不是套接字方面的专家,所以我可能遗漏了一些东西。@JavaRobots数据当然会被抛出,但你没有说这是一个可以接受的结果。它是?你还需要考虑连接本身需要时间。更重要的是,这两个模拟是同步的,而不是每个位置都通过,所以为了保持同步而丢失数据点是可以接受的。说到这一点,我应该更具体地回答我的问题。