簡體   English   中英

可靠地寫入Java SocketChannel

[英]Reliable write to Java SocketChannel

我對Java SocketChannel有疑問。

假設我有一個以阻塞模式打開的套接字通道; 調用write(ByteBuffer)方法后,我得到一個整數,描述寫入了多少個字節。 javadoc說: “返回:寫入的字節數,可能為零”

但這到底什么意思? 這是否意味着確實已將字節數傳遞給客戶端(以便發送方接收到tcp ack,從而表明服務器已接收了多少字節),或者這意味着字節數已被寫入tcp堆棧? (以便某些字節可能仍在等待,例如在網卡緩沖區中)。

這是否意味着確實已將字節數交付給客戶端

否。它只是表示傳遞到本地網絡堆棧的字節數。

確保數據已傳遞到遠程應用程序的唯一方法是,如果您收到數據的應用程序級別確認。

令您困惑的段落是非阻塞I / O。

對於非阻塞操作,您的初始調用在調用時實際上可能未寫入任何內容。

除非另有說明,否則只有在寫完所有r個請求的字節之后,寫操作才會返回。 根據其狀態,某些類型的通道可能只寫入某些字節,或者可能根本不寫入。 例如,處於非阻塞模式的套接字通道寫入的字節數不能超過套接字輸出緩沖區中的可用字節數。

如您所見,為了阻止I / O,將發送所有字節(或在send中間拋出異常)。

注意,不能保證字節何時會出現在接收端,這完全取決於底層套接字協議。

暫無
暫無

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

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