我使用DataOutputStream
通过网络传输数据,如下所示:
Socket socket = new Socket(ipAddress, port);
DataOutputStream dataOutputStream = new DataOutputStream(
socket.getOutputStream());
dataOutputStream.writeBytes("Stackoverflow");
// ...
System.exit(0);
如果我的应用程序过早终止,则传输将中止,因此失败,因为此时尚未发送所有数据。
要解决此问题,我可以在终止前手动等待一段时间:
try
{
Thread.sleep(1000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
然而,这个解决方案很糟糕。是否有一些"最佳实践"在终止我的申请之前确保所有数据都已发送的方法?
编辑:
我无法访问服务器代码。
答案 0 :(得分:1)
如果我的应用程序过早终止,则传输将中止,因此在执行flush()之后失败,因为尚未发送所有数据。
数据是无缓冲的,因此每次写入都会立即发送数据。在您的情况下,flush()
没有做任何事情。
DataOutputStream.flush()
public void flush() throws IOException {
out.flush();
}
调用OutputStream.flush()
public void flush() throws IOException {
}
是否有一些“最佳实践”方法可以确保在终止我的申请之前已发送所有数据?
确保数据发送的最佳方法是等待回复。让另一端发回消息说它收到了消息,你就可以知道已收到数据了。
BTW当您完成了可关闭的资源时,最佳做法是关闭它。
答案 1 :(得分:0)
默认情况下socket.close()
会导致正常的TCP连接关闭。在该过程中,TCP堆栈将未确认的数据传递给对等方。
dataOutputStream.flush();
socket.close();
如果您将SO_LINGER设置为零,那么它将无效。
替代方法是使用socket.shutdownOutput()
:
dataOutputStream.flush();
socket.shutdownOutput();
答案 2 :(得分:0)
设置socket.setSendBufferSize(1024)
时,还请确保在接收到1024
个字节的块时将其读入。