IO程式設計 一 傳統IO程式設計

2021-10-01 17:14:53 字數 1406 閱讀 7918

假設我們要實現乙個需求 客戶端每隔兩秒向服務端傳送一次資訊,服務端接收列印

首先我們需要乙個服務端乙個客戶端

服務端socketserver

服務端監聽8000埠.迴圈接收新的客戶端連線請求.同時列印客戶端傳送來的訊息

public class socketserver 

} catch (ioexception e) }}

}

客戶端socketclient每隔兩秒會傳送一條訊息至服務端

public class socketclient 

} catch (exception e) }}

先啟動服務端,再啟動客戶端1 結果如下

此時我們修改客戶端傳送內容改為""客戶端2傳送hello world""然後啟動新的客戶端

此時結果並沒有改變 依然是只有客戶端1的訊息

接下來我們停止客戶端1 服務端接收到客戶端2的訊息.證明之前客戶端被阻塞了

我們接著對**進行修改.服務端新增多執行緒,支援多個客戶端連線

客戶端不變,服務端修改如下

public class socketserver 

} catch (ioexception e)

}).start();}}

}

同樣啟動服務端,和客戶端,然後重複上面實驗的操作,啟動客戶端1客戶端2.

發現服務端同時可以接收客戶端1,客戶端2的訊息.服務端支援多個客戶端連線.

上面的io 程式設計模型在客戶端較少的情況下執行良好,但是對於客戶端比較多的業務來說,單機服務端可能需要支撐成千上萬的連線,io 模型可能就不太合適了

上面的demo從服務端來看,每新增乙個客戶端,就會產生乙個新的執行緒,如果有成千上萬個客戶端,就會有成千上萬個執行緒,這就會有以下問題

執行緒資源受限:執行緒是作業系統中非常寶貴的資源,同一時刻有大量的執行緒處於阻塞狀態是非常嚴重的資源浪費,作業系統耗不起

執行緒切換效率低下:單機 cpu 核數固定,執行緒**之後作業系統頻繁進行執行緒切換,應用效能急劇下降。

除了以上兩個問題,io 程式設計中,我們看到資料讀寫是以位元組流為單位。

所以1.4以後 jdk提出了nio程式設計

檔案I O程式設計

linux的輸入 輸出 i o 操作,通常分為 個方面 開啟 讀取 寫入 定位和關閉 對應的有 個系統呼叫 open read write lseek 和close 這 個函式,也稱為不帶緩衝區的i o操作。程式設計師可以直接操作硬體,這樣為開發驅動等底層的系統應用提供了方便。這些函式屬於posix...

io程式設計,python

io在計算機中指input output,也就是輸入和輸出。stream 流 可以把流想象成乙個水管,資料就是水管裡的水,但是只能單向流動。input stream就是資料從外面 磁碟 網路 流進記憶體,output stream就是資料從記憶體流到外面去。由於cpu和記憶體的速度遠遠高於外設的速度...

網路程式設計之IO模型 非同步IO

linux下的asynchronous io其實用得不多,從核心2.6版本才開始引入。先看一下它的流程 使用者程序發起read操作之後,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當它受到乙個asynchronous read之後,首先它會立刻返回,所以不會對使用者程序產生任何bl...