簡體   English   中英

帶有 DataOuputStream 的套接字 output stream - 有什么保證?

[英]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 了?)。

1號門

writeflush數據。 TCP提供它。 這意味着它可能會執行重傳等。 當然,您的send不會卡住這么長時間(在某些情況下, TCP嘗試 5 到 10 分鍾,然后才會斷開連接)。 因此,您永遠不會知道對方是否真的收到了您的信息。 您將在套接字的下一個操作中收到一條錯誤消息。

2 號門

writeflush數據。 由於MTU很臟,而且字符串很長,所以它以多個數據包的形式發送。 因此,您的同伴會先reads其中的一些內容,然后再將其呈現給用戶。

所以想象你發送: “你好黑暗我的老朋友,我又來和你說話了” 對方可能會得到"Hello dark m" 但是,如果它執行后續的read ,它將獲得整個數據。 所以遠端 TCP 實際上已經收到了所有內容,它已經確認了所有內容,但用戶應用程序未能read數據以將其從 TCP 手中取出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM