查看代码:
private static void send(final Socket socket, final String data) throws IOException {
final OutputStream os = socket.getOutputStream();
final DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(data);
dos.flush();
}
我可以确定调用此方法会抛出IOException
(这意味着我最好关闭套接字),或者,如果没有抛出异常,我发送的数据保证完全发送?在我读取另一个端点上的数据时,是否有任何情况,我得到的字符串是不完整的并且没有例外?
答案 0 :(得分:3)
发送和接收之间存在很大差异。您可以成功从应用程序发送数据,然后传递给
任何这些阶段都可能失败,您的发件人也不会更聪明。
如果您想知道应用程序已成功接收并处理了数据,它必须向您发回一条消息,说明已经发生这种情况。当你收到这个,那么你知道它已被收到。
答案 1 :(得分:1)
是的,可能会发生一些事情。首先,请记住write
真的很快返回,所以不要认为执行错误检查(我的所有数据都已确认?)。
您write
和flush
您的数据。 TCP
尽可能努力地提供它。这意味着它可能会执行重传等。当然,你的send
在很长一段时间内都不会被卡住(在某些情况下,TCP
尝试5到10分钟才会破坏连接)。因此,你永远不会知道对方是否真的得到了你的信息。您将在套接字上的下一个操作中收到错误消息。
您write
和flush
您的数据。由于MTU nastiness,并且因为字符串很长,所以它以多个数据包发送。所以你的同伴reads
中的一些并在获得所有内容之前将其呈现给用户。
所以想象一下你发送:“我的老朋友你好黑暗,我再来和你谈谈”。另一方可能会得到“Hello darkness m”。但是,如果它执行后续的read
,它将获得整个数据。所以远端TCP实际上已收到所有内容,它已经确认了所有内容,但用户应用程序未能read
数据以便将其从TCP手中取出。