大一的時候,我開始搗鼓用C語言做網路程式設計,你們知道的,就是socket、bind、listen、accpet、recv、send那一套玩意兒。
我捧著一本從圖書館借來的書,按照上面的提示,一行一行的照著敲到了電腦裡,成功的寫出了一個TCP的服務端和客戶端,可以用來收發訊息。
不過客戶端和控制端都在我自己電腦上執行,自己給自己發訊息,沒意思。於是我把客戶端發給了室友,和他可以實現跨電腦通訊了。
於是就在那黑乎乎的控制檯視窗上,我們聊起來了,雖然他就在我對面,雖然只是文字資訊,雖然如此簡陋,室友還是誇我厲害,讓我充滿了成就感,原來網路程式設計這麼有意思。
成功執行以後,和室友們挑燈組隊玩了幾把穿越火線,高興~
第二天,我開始琢磨著,把客戶端發給我遠在2公里以外的女朋友,這樣晚上的時候,我們在各自的宿舍就用它代替QQ來聊天,想想還挺浪漫哈~
沒想到當即就被鄙視了,就這黑乎乎的玩意?就不能做個漂亮的介面嗎?
於是我又折騰了一個星期,用VC++ 弄了個簡單的介面出來,還從網上搞了一個漂亮的面板加上,這下漂亮多了。
我興奮的把程式發給女朋友,期待她投來崇拜的目光。
然鵝···
她居然在QQ上告訴我:彈了個視窗,提示連不上伺服器!
我服務端開著的啊?可就是死活連不上。
我迅速冷靜下來,老師教過,可以用ping命令看看網路通不通。
我用QQ遠端操作桌面過去,在她的電腦上ping我的電腦:
ping 192.168.1.103
哇靠!居然ping不通!
我弱弱的請教了有經驗的師兄,然後又被鄙視了:你這能ping通就怪了,這是區域網地址啊!
我一臉懵逼,啥叫區域網地址?為什麼就ping不通?
那時的我,剛剛學了C語言,計算機網路課程才剛剛接觸,用小白來形容完全不為過。
於是我開始瘋狂充電,這才知道了什麼叫公網地址,什麼叫私有地址,知道了宿舍裡的那個路由器,有一個叫NAT的功能,會將我們電腦上網的區域網私有地址偷偷改成公網地址,一出了宿舍,就是用公網地址在進行通訊了。
NAT的出現緩解了IP地址不夠用的問題,可以讓宿舍裡我們幾個人共用同一個IP地址上網。
現在看來很簡單的技術,但那時候不知道就是不知道啊,因此鬧了笑話。
於是我在路由器上找到了WLAN口的公網IP地址,替換了客戶端程式碼中的服務端地址,重新編譯了一個包發給女朋友。
這下總該可以了吧?
然鵝,還是不行!
估計各位看到這裡,心裡也在說那句話:這樣要是能行就怪了!
我登入到路由器後臺,把我的服務端監聽的埠號做了對映配置,迫不及待的讓女朋友再試一次!
終於,這一次她告訴我:連上了!
終於,我給她發了第一條訊息:Hello,World!
心情大好,中午加個葷菜~
用IP地址來建立連線終究不是好辦法,因為路由器上的公網IP經常變來變去,每次變了都得要重新編譯一個客戶端,可麻煩了。
要不然就每次手動輸入,但我總不能留個輸入框讓女朋友每次都填寫IP地址吧,她一定會質問我:為什麼我登入QQ,人家沒讓我填QQ的IP地址啊?
於是我又一陣搜尋,瞭解到了可以域名代替IP的方式來解決這個問題。
程式程式碼中用域名替換IP,然後動態解析成IP地址,服務端的IP地址再也不用寫死到程式碼中了。
但接著問題來了,為了這麼個破玩意兒還要去註冊個域名?註冊域名不得還要錢嗎?
公網IP經常變,是不是每次變了都得去更改這個域名對映的IP,這也還是麻煩啊!
又雙叒經過一陣研究,又瞭解到了一個叫DDNS動態域名解析的玩意兒,一個叫花生殼的軟體,下載一個客戶端,把我的幾個問題都安排的明明白白。
自己不用註冊域名,用這個花生殼下面的子域名就行,有了客戶端,隨時可以更改域名對映的IP地址,方便快捷。
再一次更改了我的程式,總算把這個問題解決了。
不過新的問題很快又來了,我這個程式只能服務端和客戶端雙方通訊,要是有第三個人、第四個人要加入,這咋整呢?
繼續改!
說回到今天寫這篇文章的主題上來。
其實吧,誰不是從小白走過來的,誰在學習的路上又沒被鄙視過,沒鬧過笑話呢?所謂聞道有先後,術業有專攻,如是而已。
從我自己學習的經歷總結來看,想要技術學的紮實,光看課程和書籍是遠遠不夠的,得動手!
去真正動手做一些專案,遇到實際的問題時,你才知道那些各種各樣的技術是什麼意思,又是為解決什麼問題而出現的,這比從書本上或部落格裡看來的要理解深刻得多。
工作幾年下來發現,基礎知識積累最多最快的還是上大學那幾年。工作以後,像作業系統、計算機網路、資料結構與演算法這些基礎課程知識,日常工作中其實真正打交道的機會並不多,更多時間都是寫寫API介面,做下CRUD,堆一堆框架程式碼積木,或者學習redis、mysql、rabbitmq、elasticsearch等第三方元件的使用。
在大學期間,我大致做過以下幾個專案:
- 即時通訊軟體
- 靜態Web伺服器
- 遠端桌面控制軟體
- 網路流量還原軟體
- Windows核心ARK工具
雖然現在看來每一個做的都挺糙的,離實用還有不少距離,但基本功能是完成了,而且透過開發這些東西,不僅對當時的我程式設計能力有了不少的提升,而且在這個過程中,不斷髮現新的技術名詞,打牢了基礎,還學到了不少課本上沒有的東西。
如果你是剛剛入行的新手,我的建議是,不僅要看書,更要多動手,Talk is cheap, show me the code!