[英]Socket output stream with DataOuputStream - what are the guarantees?
看代碼:
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
(這意味着我最好關閉套接字),或者,如果沒有引發異常,則可以保證我發送的數據被完全發送? 是否有任何情況下我在另一個端點上讀取數據時,我得到的字符串不完整並且沒有異常?
發送和接收之間存在很大差異。 您可以成功地從應用程序發送數據,但它隨后會傳遞給
這些階段中的任何一個都可能失敗,您的發件人也不會更聰明。
如果您想知道應用程序已成功接收並處理了數據,它必須向您發送一條消息,說明這已發生。 當你收到這個時,你就知道它已經收到了。
是的,可能會發生幾件事。 首先,記住write
return 真的很快,所以不要想太多的錯誤檢查(我的所有數據都被 ACKed 了?)。
您write
和flush
數據。 TCP
提供它。 這意味着它可能會執行重傳等。 當然,您的send
不會卡住這么長時間(在某些情況下, TCP
嘗試 5 到 10 分鍾,然后才會斷開連接)。 因此,您永遠不會知道對方是否真的收到了您的信息。 您將在套接字的下一個操作中收到一條錯誤消息。
您write
和flush
數據。 由於MTU很臟,而且字符串很長,所以它以多個數據包的形式發送。 因此,您的同伴會先reads
其中的一些內容,然后再將其呈現給用戶。
所以想象你發送: “你好黑暗我的老朋友,我又來和你說話了” 。 對方可能會得到"Hello dark m" 。 但是,如果它執行后續的read
,它將獲得整個數據。 所以遠端 TCP 實際上已經收到了所有內容,它已經確認了所有內容,但用戶應用程序未能read
數據以將其從 TCP 手中取出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.