NIO 非阻塞客戶端只能接受到一部分伺服器的資料

2021-08-16 02:04:18 字數 838 閱讀 1661

遇到的問題:nio 非阻塞socket通訊時(伺服器向客戶端響應大檔案時,伺服器還在不停讀取資料,客戶端就已經先讀完資料了,結束了迴圈),發現有時候伺服器端傳送的檔案客戶端只接受到一部分。

原因:可能是因為非阻塞的原因,只要通道內有資料時,客戶端就會開始迴圈接受,但是伺服器可能寫資料慢了一步,客戶端發現讀取完畢了,就退出迴圈了

解決方法:在外部套了乙個死迴圈,多讀幾遍

帶來的問題:客戶端收完資料一直退出不了了

嘗試解決的**如下:         

思路:做了一回二次判斷,中間間隔了一部分時間,如果兩次同時都返回-1,可能真的沒資料了,就修改標誌退出迴圈,但是我是單機測試,傳2g電影時100毫秒沒出什麼問題,但不代表沒有bug,希望大牛們多多指教,有更好的方法大家共享一下。       

//由於讀寫速度可能不一致,所以輪詢多讀幾遍,但是現在找不到方法退出輪詢

boolean flag2 = true;

while (flag2)

//這裡是二次判斷,如果兩次都是-1,可能就是沒再傳回來資料了,修改標誌,跳出迴圈

if(channel.read(buf) == -1) }}

在寫這篇blog 的時候,發現讀不到資料返回0,讀取完畢返回-1,其實沒必要死迴圈,只需要將》0改為 != -1即可,

不知道網上為什麼很多人都寫成 >0 ,有什麼理由請大牛告知

這裡使用 != -1,效果很好,自己挖坑自己跳,以後再也不 >0 了

int len = 0;

//這個channel是獲取的socketchannel,是伺服器往客戶端寫過來資料的通道

while((len = channel.read(buf)) != -1 )

ART PI之UDP非阻塞客戶端

服務端控制客戶端的小電機 pwm 方式 客戶端 art pi,向服務端傳送天氣資訊和客戶端狀態,訊息格式s d v d n d l s 服務端 自製python服務端,埠繫結8887,傳送電機控制命令 60 61 62 63 64 hex 0x36 0x30.遇到的問題 雖然使用的是udp 連線,預...

NIO客戶端主要建立過程

nio客戶端主要建立過程 socketchannel clientchannel socketchannel.open 步驟二 設定socketchannel為非阻塞模式,同時設定客戶端連線的tcp引數,示例 如下 clientchannel.configureblocking false sock...

關於PgPool客戶端阻塞

碰到過此問題,轉一篇分析的很透徹的文章 關於pgpool客戶端阻塞 最近遇到乙個pgpool連線阻塞問題,pgpool剛開啟是能成功連線的,過段時間就連線不上了。檢視pgpool日誌,啟動成功,連線資料庫節點成功,健康檢查成功。然後懷疑是併發數過多導致阻塞。一開始,更改了pgpool.conf的ma...