標籤:
首發:個人部落格,更新&錯誤修正&回複
之前關於c/s的一篇博文只記了思路沒記代碼,而且表達不清晰,事後看不知所云,這個習慣要改。
這十幾天學了點關於作業系統、windows編程和網路,主要看的書有以下幾本,都沒看完或者只看了一點,記下書名先:
《現代作業系統》
《深入解析windows作業系統》
《windows程式設計》
《c#入門經典》
《wpf編程寶典》
《圖解tcp/ip》
另外《tcp/ip詳解》《java網路編程》《netty權威指南》是準備接下來看的。
1.作業系統
應用程式和硬體之間的夾層,向上暴露方便編程的介面,向下管理硬體。
核心的核心:進程,地址空間和檔案,這三者分別是CPU、記憶體、硬碟的抽象。
進程和線程都是容器,CPU在多個容器間往來穿梭,就像有多個CPU似的。
2.windows
分為使用者態和核心態,重要代碼運行在核心態,應用程式運行在使用者態,應用程式通過調用api進行編程。具體見《深入解析windows作業系統》。
windows api編程,mfc編程,form編程,wpf編程。介面編程技術越來越多了,但學api編程還是有用,會理解底層原理。讀《windows程式設計》吧。
c#跟java很像,但強大很多,像是java+文法糖一樣,《c#入門經典》是入門書。
現在好像推薦wpf編程而不是使用form了,《wpf編程寶典》是為了湊單買的,好厚一本,躺著沒法讀。
3.網路
傳輸層的tcp協議和網路層的ip協議是最關鍵的,不過《圖解tcp/ip》不像《圖解http》那樣簡單可愛,可能是因為本來就更複雜的緣故。
還要再讀讀,還有最有名的《tcp/ip詳解》。
雖然我java用了很久,但除了web之外的網路編程其實不多,《java網路編程》和《netty權威指南》應該讀讀。nio這塊的課也該補一下。
4.一個demo
socket編程其實足以用來開發各種c/s程式,上次博文代碼找不到了,這次重新寫,剛好還學了點兒windows編程,就用wpf做個exe程式的用戶端,這回真像c/s程式了。
socket處於應用程式層和傳輸層之間,提供使用tcp協議的可能性,由應用程式層的程式碼調用。
雙向傳輸中的“讀”這塊,由於while(xx.readLine)是阻塞的,所以用戶端和服務端都需要使用一個專門線程用於等待響應。
線程就像是人,傳統單線程程式好比只有一個人的公司,每多一個線程就好比多一個員工,這樣同一個時間可以真正同時做多件事了,尤其是阻塞這種“需要有個人傻等”的情況。CPU是大腦,而進程、線程是對CPU的抽象,多進程/線程就像多大腦,能齊頭並進地處理事情,當你發現你的程式需要多個大腦,就採用多線程吧。
代碼在這裡,包括了java和c#的用戶端,以及用java寫的伺服器。
java寫的伺服器打成可執行jar包,然後寫個bat指令碼,內容如下:
call java -jar myServer.jar
就能方便地啟動了。
c#的程式最讓我驚豔的是函數是一等對象了:
這行(doClose是個函數)
this.Closing += doClose;
和這行(doReceive是個函數)
receiveThread = new Thread(doReceive);
的寫法都讓人感到好舒服。
然後下面是類似android的代碼,新線程想改變控制項內容不能直接改,因為控制項屬於主線程。
this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,(ThreadStart)delegate ()
{
theLabel.Content = msg;
});
“委託”這東西我感覺就像javascript裡所謂的函數字面量,或者java中的匿名內部類(用來提供方法體的)。
長期歡迎項目合作機會介紹,項目收入10%用於酬謝介紹人。新浪微博:@冷鏡,QQ:908789432。
作業系統,windows編程,網路,socket