JAVA阻塞socket
1. java socket 阻塞和非阻塞 會對數據傳輸有什麼影響
阻塞 阻塞調用是指調用結果返回之前,當前線程會被掛起。函數只有在得到結果之後才會返回。有人也許會把阻塞調用和同步調用等同起來,實際上他是不同的。對於同步調用來說,很多時候當前線程還是激活的,只是從邏輯上當前函數沒有返回而已。例如,我們在CSocket中調用Receive函數,如果緩沖區中沒有數據,這個函數就會一直等待,直到有數據才返回。而此時,當前線程還會繼續處理各種各樣的消息。如果主窗口和調用函數在同一個線程中,除非你在特殊的界面操作函數中調用,其實主界面還是應該可以刷新。socket接收數據的另外一個函數recv則是一個阻塞調用的例子。當socket工作在阻塞模式的時候,如果沒有數據的情況下調用該函數,則當前線程就會被掛起,直到有數據為止。 非阻塞 非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回。 對象的阻塞模式和阻塞函數調用 對象是否處於阻塞模式和函數是不是阻塞調用有很強的相關性,但是並不是一一對應的。阻塞對象上可以有非阻塞的調用方式,我們可以通過一定的API去輪詢狀態,在適當的時候調用阻塞函數,就可以避免阻塞。而對於非阻塞對象,調用特殊的函數也可以進入阻塞調用。函數select就是這樣的一個例子
2. java socket 服務端接收數據阻塞。
這個首先要排除程序族碰上的邏輯錯誤,如果減少了壓力是否還有這種現象呢?如果程序沒有問題簡單的辦法就是孫彎在服務端校驗數據長度,如果長度錯誤則返兆凱談回錯誤代碼給客戶端要求客戶端重新發送消息。有時候網路擁堵,機器的性能也會有影響到結果,需要逐個排除。
3. JAVA socket傳送文件一直被阻塞
客戶端拆褲不是進入死循環了,而是停在chunkSize = buffile.read(line),這句代碼上了,客戶端在等待伺服器傳送數據來;
就跟你伺服器接受客戶端一個情況:
while(true){
Socket s=ss.accept();
}
此時你的客戶端收數據就是這個意思,所以你客旅橡簡戶端不能寫!=-1
服務端往流里寫數據!=-1 是正常的讀文件判斷,應該這樣,當滿足是,也就是文件讀完了,他將不忘客戶端發送數據了,而如升客戶端一直等等,此時就是我上面說的了,也就是你說的「死循環」
所以應該按照1樓說的 ,伺服器!=-1 後,你在寫一個比如「結束」 到客戶端,客戶端while里是 如果接受「結束」 就停止
4. java SOCKET編程 ,如何跳出accept() 阻塞
首先你這個邏輯就有問題
你如果想先將數據發給客戶端,那麼必須要讓客嘩銀戶端先連接到服務端,你才能進行發送對吧
那麼你就可以把這個總是細分,第一步,客戶端連接到用器亂祥宴,這時候你的伺服器才能向客戶端發送資料庫,第二步客戶端處理完服務端的宴猜數據,再次向服務端發送數據
另外,你服務端應該用多線程進行交互
即一發現有客戶端連接
就立馬啟動一條線程來處理請求
5. JAVA socket聊天室程序 readLine()阻塞
對每一個客戶端都建立一個線程來接收消息,發消息與接消息不要在同一線程上,那就才能解決阻塞問題。一般新手用socket編程,大都是遇到阻塞問題不懂解決,導致了收發消息失敗。其實網上socket聊天通訊的例子大把,遇到問題查查看,思考下就能明白了。
有問題歡迎提問,滿意請採納,thx.