假設我們要實現乙個需求 客戶端每隔兩秒向服務端傳送一次資訊,服務端接收列印
首先我們需要乙個服務端乙個客戶端
服務端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...