【網路程式設計】阻塞IO程式設計的坑
echo服務阻塞
假設這樣一個簡單的echo場景:客戶端向服務端傳送20M的資料,傳送完之後接收資料,而服務端每次接收4k資料,接受完全部資料之後進行回顯。這樣的客戶端和服務端程式啟動之後,會意外的阻塞。阻塞的點在哪裡呢
因為客戶端傳送完資料之後才會進行接收資料,而服務端接收到了4k資料之後就會進行回顯,這時服務端傳送到客戶端的核心緩衝區中,注意這時客戶端並沒有讀取資料,所以客戶端的接收緩衝區中的資料一直積累,直到積累到某個閾值,此時服務端的tcp advertised window大小為0,tcp不能傳送資料,結果就是服務端阻塞在傳送。此時客戶端仍然在一直的傳送資料,但這個時候服務端是沒有進行讀取資料的,直到服務端的緩衝區也滿,最後客戶端也阻塞在傳送。導致雙方都阻塞在傳送資料。
那麼怎樣解決這個問題呢。其實只要服務端每次把資料全部讀取進來,然後進行傳送即可。全部讀取之後,客戶就開始接收資料,此時服務端傳送資料就不會造成客戶端的緩衝區滿,服務端也就不會阻塞在傳送資料。
相關文章
- 玩轉 PHP 網路程式設計全套阻塞與非阻塞 IOPHP程式設計
- Java 網路程式設計 —— 非阻塞式程式設計Java程式設計
- 一文徹底搞定(阻塞/非阻塞/同步/非同步)網路IO、併發程式設計模型、非同步程式設計模型的愛恨情仇非同步程式設計模型
- 阻塞式程式設計和非阻塞式程式設計區別程式設計
- 網路程式設計之IO模型程式設計模型
- Java網路程式設計和NIO詳解5:Java 非阻塞 IO 和非同步 IOJava程式設計非同步
- 網路程式設計框架t-io的程式設計基本知識介紹程式設計框架
- Linux網路程式設計之IO模型Linux程式設計模型
- [譯] 非同步程式設計:阻塞與非阻塞非同步程式設計
- 網路通訊程式設計程式設計
- py網路工具程式設計程式設計
- NIO非阻塞程式設計小案例程式設計
- Java 網路程式設計(TCP程式設計 和 UDP程式設計)Java程式設計TCPUDP
- Java網路程式設計和NIO詳解3:IO模型與Java網路程式設計模型Java程式設計模型
- 【go網路程式設計】-HTTP程式設計Go程式設計HTTP
- 程式設計師,請你不要在坑程式設計師了?程式設計師
- python 網路篇(網路程式設計)Python程式設計
- Java併發程式設計:阻塞佇列Java程式設計佇列
- Java併發程式設計——阻塞佇列Java程式設計佇列
- Python學習之IO程式設計Python程式設計
- python非同步IO程式設計(一)Python非同步程式設計
- 程式設計和網路程式設計入門程式設計
- JAVA網路程式設計(2)TCP程式設計Java程式設計TCP
- 不會填坑的程式設計師不是一個好程式設計師!程式設計師
- 程式設計路漫漫程式設計
- 玩轉 PHP 網路程式設計全套之多程式程式設計PHP程式設計
- 【Linux網路程式設計】網路程式設計常見概念Linux程式設計
- Java 網路程式設計 —— 實現非阻塞式的伺服器Java程式設計伺服器
- 併發程式設計——IO模型詳解程式設計模型
- Linux系統程式設計-檔案IOLinux程式設計
- 網路程式設計-計算機網路三要素程式設計計算機網路
- 網路程式設計程式設計
- Python網路程式設計——程式Python程式設計
- 深圳IO:Shenzhen IO for Mac(燒腦程式設計遊戲)Mac程式設計遊戲
- 程式設計師技術入股的那些坑程式設計師
- python網路-Socket之TCP程式設計(26)PythonTCP程式設計
- linux非阻塞式socket程式設計之select()用法Linux程式設計
- 程式設計師的路好走嗎程式設計師