簡體   English   中英

將InputStream(阻塞)的內容寫入非阻塞套接字

[英]Write contents of an InputStream (blocking) to a non-blocking socket

我正在編寫一個簡單的Java NIO服務器並且有點頭疼:我得到普通的InputStream需要管道到我的客戶端。 other connection writing will be paused. 我有一個線程執行所有寫操作,因此這會產生一個問題:如果InputStream阻塞, 其他連接寫入將被暫停。

call read() to know. 我可以使用InputStream.available()來檢查是否有任何傳入的數據我可以無阻塞地讀取,但如果我已經到達流末尾,我似乎調用read()才能知道。

這給我帶來了很大的麻煩,但我不可能相信我是第一個遇到這個問題的人。

到目前為止我提出的唯一選擇:

  • 為每個InputStream都有一個單獨的線程,但這只是愚蠢的,因為我首先使用的是非阻塞I / O. 我也可以讓一個線程池執行此操作但是再次限制了我可以將InputStream傳遞給的並發客戶端的數量。
  • 有一個單獨的線程讀取這些流超時(如果讀取持續時間超過一定的時間,則使用另一個線程來中斷),但如果我有許多打開的InputStream不提供數據,那么這肯定會阻塞數據流。

當然,如果有一個神奇的InputStream.isEof()isClosed()那么這根本不會有任何問題:'(

.....每個InputStream都有一個單獨的線程,但是這很愚蠢,因為我首先使用非阻塞I / O ......

這根本不是愚蠢的。 首先,您需要檢查是否可以從InputStream實現中檢索SelectableChannel。 如果確實如此,你很幸運,你可以用選擇器注冊它並像往常一樣。 但是很有可能你的InputStream可能有一個不是SelectableChannel的通道,在這種情況下“為每個InputStream創建一個單獨的線程”是顯而易見的事情,可能是正確的事情。

請注意,在SO中討論的類似問題是無法從輸入流獲取SelectableChannel 不幸的是你被困住了。

我有一個執行所有寫操作的線程

你有沒有停下來考慮這是否是問題的一部分而不是解決方案的一部分?

暫無
暫無

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

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