簡體   English   中英

NIO:發送消息然后立即斷開連接

[英]NIO: Send message and then disconnect immediately

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

這是否正確,如果是這樣,是否有建議的方法來處理這種情況?

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

SocketChannel.write將以非阻塞模式返回可以立即發送到網絡而不會阻塞的字節數。 您的問題讓我認為您希望write方法使用整個緩沖區並異步嘗試將其他數據發送到網絡,但這不是它的工作方式。

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

你可能最好啟動一個線程並同步地將數據寫入通道。 async api更傾向於“一個線程調度多個通道”而不是真正用於消防和忘記通信。

套接字的close()方法確保,使用write之前發送的所有內容實際上是在套接字真正關閉之前發送的。 但是,這假設您的write()能夠將所有數據復制到tcp堆棧輸出窗口,這不會始終有效。 對於解決方案,請參閱其他答案。

暫無
暫無

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

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