2010-02-03 65 views
3

在某些情況下,我希望使用非阻塞I/O從服務器向客戶端發送錯誤消息(SocketChannel.write(ByteBuffer)),然後斷開客戶端連接。假設我寫了郵件的全部內容,然後立即斷開連接,我假定客戶端可能不會收到此消息,因爲我猜測操作系統在這一點上實際上沒有發送數據。NIO:發送消息,然後立即斷開

這是否正確,如果有的話,是否有推薦的方法來處理這種情況?

我正在考慮使用計時器,如果我想斷開客戶端連接,我會發送一條消息,然後在1-2秒後關閉連接。

回答

1

SocketChannel.write將以非阻塞模式返回可以立即發送到網絡而沒有阻塞的字節數。你的問題讓我認爲你希望寫入方法消耗整個緩衝區,並嘗試異步發送額外的數據到網絡,但這不是它的工作原理。

如果您確實需要確保在斷開套接字之前將錯誤消息發送給客戶端,那麼在調用write方法之前,我只需啓用阻塞。使用非阻塞模式,您必須在循環中調用write,計算每次調用發送的字節數,並在成功將整個消息傳遞到套接字時退出循環(我知道,不必要的代碼,繁忙的等待等等)。

0

您可能更適合啓動線程並同步將數據寫入通道。異步api更適合於「一個線程調度多個通道」,而不是真正用於消防和遺忘通信。

0

套接字方法close()確保使用寫之前發送的所有內容實際上在套接字真正關閉之前發送。但是,這假定您的write()能夠將所有數據複製到tcp堆棧輸出窗口,而這並不總是有效。有關此解決方案,請參閱其他答案。