有时数据包只在进程结束后传输? 【JAVA]

时间:2009-12-10 21:13:12

标签: java packet

我有一个应用程序打开数据报套接字并发送到各种其他进程....有时这个应用程序会激活另一个进程(使用ProcessBuilder),它也会进行一些网络通信......

现在,笑话是,启动过程将“有时”仅在主应用程序终止后收到消息...或者有时它会发送到X但它们只会在主应用程序停止时传递...

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

你看过socket.setTcpNoDelay(true);吗?

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

编辑: 对不起,我认为这仅适用于非数据报套接字。可能不是你的问题。

答案 2 :(得分:0)

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

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

编辑:

但实际上,我认为最可能的原因是子进程阻塞,因为父进程没有读取写入子进程的内容......直到 重要的是,为时已晚。作为实验,将以下内容添加到子进程启动:

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

如果这个hack修复了问题,那么这是根本问题的确定迹象。

答案 3 :(得分:0)

子流程是否写入System.outSystem.err?在子进程启动后,您是否设置了主流程来排空这些流?可能是子进程刚刚死锁,试图在未被读取的阻塞流上打印日志消息。当父应用程序被杀死时,流被取消阻止,一切都开始再次移动。这可能是一个长镜头,但是当我开始检查时,我已经被它咬了足够多次。