學(xué)習(xí)網(wǎng)絡(luò)編程幾個(gè)不錯(cuò)的項(xiàng)目!
大家好,關(guān)注公眾號(hào)的不少小伙伴都是后臺(tái)方向的,很多小伙伴在私信問我有什么推薦的項(xiàng)目(具體見文末)
尤其是學(xué)習(xí) C++ 的同學(xué),很多都是做的 Web 服務(wù)器項(xiàng)目,而學(xué)習(xí) Java 的同學(xué)不少是用現(xiàn)成的 Web 框架做的電商、秒殺這類項(xiàng)目。
所以今天在這給大家推薦一類項(xiàng)目:網(wǎng)絡(luò)編程。
說白了,就是直接發(fā)送 TCP 或者 UDP 的數(shù)據(jù)包, 任何語(yǔ)言都一樣,使用語(yǔ)言自帶的 Socket API 即可。
其實(shí)現(xiàn)在絕大多數(shù)應(yīng)用、瀏覽器基本都是 C/S 模式,也就是一個(gè)客戶端,一個(gè)服務(wù)端。
最常見的是通過 HTTP 協(xié)議進(jìn)行客戶端和服務(wù)端的數(shù)據(jù)傳輸,需要更高效數(shù)據(jù)傳輸或者自定義協(xié)議的時(shí)候一般就會(huì)使用 socket 編程。
其實(shí) socket 編程編碼起來非常簡(jiǎn)單,就跟讀寫文件差不多,雙方通過 listen、connect、accept 等函數(shù)建立一個(gè)連接,也可以叫做文件描述符 sockfd。
接下來就可以使用 write、read 等文件讀寫函數(shù)對(duì)其進(jìn)行操作,典型的 TCP 編程流程如下:

可以說網(wǎng)絡(luò)編程是互聯(lián)網(wǎng)的基石,不過實(shí)際工作中大多數(shù)同學(xué)是接觸不到網(wǎng)絡(luò)編程這一層的,因?yàn)槎际乾F(xiàn)成的 RPC 框架。
框架已經(jīng)幫我們做了協(xié)議解析、網(wǎng)絡(luò)數(shù)據(jù)傳輸、解封包這些底層操作。
但是我覺得網(wǎng)絡(luò)編程技能還是很重要的,大家可以在學(xué)校期間學(xué)習(xí)掌握。
學(xué)習(xí)資料
接下來給大家推薦一些不錯(cuò)的學(xué)習(xí)路線和資料:
首先,建議不要直接上來就去看《Unix網(wǎng)絡(luò)編程》,我知道這本書被譽(yù)為網(wǎng)絡(luò)編程圣經(jīng),甚至 UNP 和 APUE 被稱為鵝廠敲門磚。
這本書雖然非常經(jīng)典,但是由于細(xì)節(jié)太多,太厚,需要時(shí)間比較長(zhǎng),所以不建議初學(xué)者一開始就去看。
先去隨便找菜鳥教程或者 man 手冊(cè)熟悉常用的 socket api,先寫幾個(gè)網(wǎng)絡(luò)聊天室、文件傳輸這種 demo,然后再去深入學(xué)習(xí)細(xì)節(jié)。
網(wǎng)絡(luò)編程重點(diǎn)知識(shí)
Linux 下網(wǎng)絡(luò)編程核心的包括系統(tǒng)編程和網(wǎng)絡(luò) IO 兩個(gè)部分:
進(jìn)程間通信方式:信號(hào)量、管道、共享內(nèi)存、socket 等 多線程編程:互斥鎖、條件變量、讀寫鎖、線程池等 五大 IO 模型:同步、異步、阻塞、非阻塞、信號(hào)驅(qū)動(dòng) 高性能 IO 兩種模式:Reactor 和 Proactor( Linux 下由于缺少異步 IO 支持,基本沒有 Proactor IO 復(fù)用機(jī)制:epoll、select、poll( C10K 問題)
推薦的書
《Unix網(wǎng)絡(luò)編程》 《Unix環(huán)境高級(jí)編程》
這兩本是磚頭書,雖然是網(wǎng)絡(luò)編程和 Unix 系統(tǒng)編程方面的無出其右的圣經(jīng),但主要用途還是墊顯示器(逃
《Linux高性能服務(wù)器編程》
我強(qiáng)烈推薦,這本書前半部分基本是在重復(fù)計(jì)網(wǎng)基礎(chǔ)知識(shí),但是后面幾章關(guān)于高性能服務(wù)器程序框架、高性能IO、IO復(fù)用、定時(shí)器、多線程編程、線程池和進(jìn)程池還是講得非常全面到位的,值得一看,看完基本上對(duì)于整個(gè)網(wǎng)絡(luò)編程就有了框架。
《Linux多線程服務(wù)器端編程》
這本書同樣強(qiáng)烈推薦,這是陳碩大佬寫的書,說實(shí)話第一部分:C++ 多線程系統(tǒng)編程都直接把我看蒙了,沒有想到 C++ 里要做到線程安全這么難,第一章我看了兩三遍才看懂吧。。。這是難得的講解 C++ 多線程編程的書。
并且在書中,陳碩大佬用了一章講解了 Muduo 網(wǎng)絡(luò)庫(kù)設(shè)計(jì)與實(shí)現(xiàn),Muduo 比較適合學(xué)完基礎(chǔ)的網(wǎng)絡(luò)編程后繼續(xù)進(jìn)階學(xué)習(xí)如何設(shè)計(jì)和寫一個(gè)網(wǎng)絡(luò)庫(kù),是一個(gè)高質(zhì)量的 Reactor 網(wǎng)絡(luò)庫(kù),采用 one loop per thread + thread pool 實(shí)現(xiàn),代碼比較簡(jiǎn)潔,書和源碼搭配著看作為學(xué)習(xí)網(wǎng)絡(luò)編程方面來說是非常不錯(cuò)。
推薦的項(xiàng)目
學(xué)完網(wǎng)絡(luò)編程就可以寫點(diǎn)小項(xiàng)目練手了,這里列舉幾個(gè)項(xiàng)目:
HTTP 服務(wù)器
這個(gè)似乎成了 Linux C/C++ 人手一個(gè)的項(xiàng)目了?
這里推薦一個(gè)做為參考:
https://github.com/imarvinle/WebServer
Web Server 可以擴(kuò)展寫的地方還是挺多的,比如可以加入代理功能,這部分我在留學(xué)生 lab 中寫過,但是沒有集成到這個(gè)里面來,可以加入日志庫(kù),可以添加 CGI 支持等等。
網(wǎng)絡(luò)庫(kù)
這個(gè)也算是造輪子了, 可以就采用 one loop per thread + thread pool 這種模式,建議先去看懂 Muduo 源碼,然后自己再寫一個(gè)類似的,這個(gè)過程就算是抄,你也可以學(xué)到不少東西的,先看,再模仿、修改。
地址: https://github.com/chenshuo/muduo
RPC
實(shí)現(xiàn)一個(gè) PRC 需要考慮到序列化、網(wǎng)絡(luò)傳輸、服務(wù)發(fā)現(xiàn)等,比較有名的有 grpc、brpc 等。
brpc 是一個(gè)基于 protobuf 接口的 RPC 框架,現(xiàn)在已經(jīng)進(jìn)入頂級(jí)開源社區(qū) Apache。
它的官方倉(cāng)庫(kù)文檔就非常完善了:

小而美的 RPC 框架也可以看下 搜狗 RPC:https://github.com/sogou/srpc
這個(gè)底層基于搜狗另外一個(gè)開源項(xiàng)目:https://github.com/sogou/workflow
并且代碼量都不是特別大,基本在萬行左右,適合個(gè)人學(xué)習(xí)。
網(wǎng)絡(luò)聊天室
簡(jiǎn)單版的就可以直接在局域網(wǎng)內(nèi)實(shí)現(xiàn)群聊、單聊等。
更進(jìn)一步可以考慮一下如何不通過服務(wù)器中轉(zhuǎn)消息實(shí)現(xiàn) P2P 聊天,類似 QQ,這里會(huì)涉及到 UDP 打洞、NAT 轉(zhuǎn)換等知識(shí),還是很有意思的,我大二用 Java 搞過。
不管 Java 還是 C++,這些基礎(chǔ)的網(wǎng)絡(luò)編程概念都是共通的。
聯(lián)機(jī)游戲
其實(shí)就是將一些單機(jī)小游戲考慮做成聯(lián)機(jī)的,我當(dāng)時(shí)是做的聯(lián)機(jī)版五指棋,關(guān)鍵就是將游戲數(shù)據(jù)、狀態(tài)通過網(wǎng)絡(luò)進(jìn)行同步。
比如 聯(lián)機(jī)坦克大戰(zhàn),這些做起來應(yīng)該會(huì)挺有意思的。
