我有一个应用程序打开数据报套接字并发送到各种其他进程....有时这个应用程序会激活另一个进程(使用ProcessBuilder),它也会进行一些网络通信......
现在,笑话是,启动过程将“有时”仅在主应用程序终止后收到消息...或者有时它会发送到X但它们只会在主应用程序停止时传递...
我不知道发生了什么......有人听说过这样的事吗?只有在进程停止时才传输数据包?
答案 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.out
或System.err
?在子进程启动后,您是否设置了主流程来排空这些流?可能是子进程刚刚死锁,试图在未被读取的阻塞流上打印日志消息。当父应用程序被杀死时,流被取消阻止,一切都开始再次移动。这可能是一个长镜头,但是当我开始检查时,我已经被它咬了足够多次。