Java 有时数据包仅在进程结束后传输?[爪哇]

Java 有时数据包仅在进程结束后传输?[爪哇],java,packet,Java,Packet,我有一个应用程序,它打开一个数据报套接字并发送到其他各种进程。。。。有时,此应用程序启动另一个进程(使用ProcessBuilder),该进程还进行一些网络通信 现在,笑话是,启动的进程“有时”只会在主应用程序终止后接收消息。。。或者有时它会发送到X,但它们只会在主应用程序停止时发送 我不知道发生了什么事。。。有人听说过这样的事吗?只有在进程停止时才传输数据包?我已经用Java中的套接字编程了一段时间,但我确实记得必须显式刷新套接字才能“强制”发送所有数据。这将在为您关闭套接字时完成,这将解释您

我有一个应用程序,它打开一个数据报套接字并发送到其他各种进程。。。。有时,此应用程序启动另一个进程(使用ProcessBuilder),该进程还进行一些网络通信

现在,笑话是,启动的进程“有时”只会在主应用程序终止后接收消息。。。或者有时它会发送到X,但它们只会在主应用程序停止时发送


我不知道发生了什么事。。。有人听说过这样的事吗?只有在进程停止时才传输数据包?

我已经用Java中的套接字编程了一段时间,但我确实记得必须显式刷新套接字才能“强制”发送所有数据。这将在为您关闭套接字时完成,这将解释您观察到的行为。

您是否查看了
socket.setTcpNoDelay(true)

这是一种优化,在通过网络发送数据之前,等待收集一定数量的数据。对于发送零星和少量数据的应用程序,应将其设置为off

编辑:
对不起,我想这只适用于非数据报套接字。可能不是您的问题。

一种可能性是,这是使用数据报的结果。数据报本质上是不可靠的,数据包可能会被丢弃或无序发送

也可能是您的应用程序终止得太快。应用程序和启动的进程是否进行握手以确保它们都知道何时关闭

编辑:

但实际上,我认为最可能的原因是子进程阻塞,因为父进程不读取写入子进程输出的内容。。。直到 现在重要已经太晚了。作为实验,将以下内容添加到子进程启动中:

OutputStream os = new FileOutputStream(...); // pick a suitable temp filename
System.setOut(os);
System.setErr(os);

如果此黑客修复了问题,这肯定表明这是根本问题。

子进程是否正在写入
System.out
System.err
?您是否已将主进程设置为在子进程启动后排出这些流?可能是子进程在试图打印未被读取的阻塞流上的日志消息时陷入僵局。当父应用程序被终止时,流将被解除阻止,所有内容将再次开始移动。这可能是一个漫长的过程,但在启动子进程时,我已经被它咬了很多次,我总是检查这些子进程。

您的意思是,即使您一直等待,数据包也不会发送,直到您终止该进程?或者,你的意思是在进程正常终止后,在收到数据包之前,有时会有一点延迟。永远等待。。。但是在99%的时间里,所有消息都集中在一起,杀死主进程……当应用程序被“锁定”(即:不发送已建立的数据包)时,线程在做什么?与其杀死父应用程序,不如得到它的线程转储,然后看看等待的是什么。OP说他使用的是数据报(我猜是UDP)。所以我不认为这会有任何影响。但我还没有完成发送。。。我应该在每次发送后关闭=每次发送前关闭新的DataSocket吗?@Shaitan:他说“刷新”是强制发送,而不是“关闭”-提到关闭只是说关闭会刷新,结束JVM会关闭任何打开的进程句柄。我该如何刷新它?DatagramSocket没有.flush(),我还没有处理完它。。。但我想让消息重新发送,而不是在一个庞大的一堆的主要应用程序被杀死…耶。。。我发现这是一条艰难的路。。。它导致我的整个应用程序被阻止。。。但是现在。。。我通过了.SEND,但它只是没有得到交付(它们堆积在某处),直到应用程序被杀死,然后它们才匆忙进来