1. 程式人生 > >自己動手——快速搭建Android應用伺服器

自己動手——快速搭建Android應用伺服器

Motivation

我寫這套博文的目的,是在自己學會、實現並熟練掌握之後,想幫助下面將會提到的這樣一群正在學習Android的初學者,通過將自己的經驗傳遞出去,讓他們少走一點彎路,節省大量用在查詢和翻閱資料上的時間。

我在學習編寫自己的Android應用程式伺服器的時候遇到過以下的問題:
1.我需要準備什麼?
2.我該選擇哪一套實現方案?
……
這些問題的搜尋和查證都需要佔用大量的時間,以至於初學者們手頭的專案可能長達幾個月沒有進展,而我會一一為大家解決這些問題,你只需要花費看這一篇博文的時間。

這套博文適合以下人群:

1.Android單機程式已經寫得很熟練,想給自己的程式(參賽作品或者畢設什麼的)新增伺服器支援的初學者;
2.被團隊中分配去搭建伺服器,想做但是毫無頭緒的初學者。
……

如果滿足以上任意一條,那麼恭喜你,這套博文正是你要找的!

好了,言歸正傳:

一、我需要準備什麼?

硬體要求:

一臺聯網的電腦(一般情況下是自己的PC)

軟體要求:

安裝JDK並配置完環境變數
還有一些軟體是需要用到的,到了具體的章節我們再引入。

知識儲備要求:

1.比較熟練的Java程式設計能力:
對於上述第1類人群,不會Java是說不通的。
對於上述第2類人群,博主本人是用Java編寫的伺服器端程式,你不想學Java也得去學PHP什麼的,關鍵是這種一整套的教程也不好找。

2.計算機網路基礎知識:
對以下概念有較清晰的認識即可(不清楚的借一本計算機網路或者分條去查都可以快速搞明白):
①內網與外網;②區域網;③IP地址;④埠號;⑤Http請求;

3.資料庫相關知識:
不會的必須找本書仔細學習一下。這個就不是隨便查查就能懂的了。且有的知識(如正規化)邏輯性較強,需要花時間認真學習。

二、我該選擇哪一套方案?

在具有了一臺聯網電腦這一硬體條件後,我們的伺服器僅僅有了一個容器,真正能讓它工作起來的是一套軟體相關的東西,那麼我們就會去查,但是很遺憾,我們查到的99%的結果是網站伺服器搭建,且博文1說A+B+C可以實現伺服器,博文2又說A+D+E可以實現伺服器……各種博文又丟擲了一堆的框架。對於初學者來說,我就是交個畢設,或者僅僅需要支援一兩個使用者(自己和團隊成員)的測試伺服器,需要這麼多概念嗎?作為初學者到底應該學什麼?

以上的問題並非捏造,確實是博主在未學會之前面臨到的問題,那麼既然我已經學會了,就給大家一個“標答”:

我們用:MySQL + Java Web + Tomcat + Volley 來實現我們的伺服器。

其中:
①MySQL是開源的資料庫軟體;
②Java Web是遵循Java語言風格的伺服器應用程式元件(即客戶端發來的請求的應答者);
③Tomcat是開源的伺服器軟體(作為Java Web應用程式的容器);
④Volley是谷歌官方為Android提供的Http請求庫(寫在Android客戶端,用於向伺服器端傳送請求)。

三、Android客戶端傳送Http請求和接收到應答的流程

我來描述一下從Android客戶端發出一趟請求到收到應答的過程(沒圖,但是我會說到各種圖往往籠統和忽略的部分):

1.客戶端呼叫Volley請求函式向指定IP地址(或域名)的伺服器發出一條Http請求(例如包含賬號和密碼的登入請求);

2.伺服器容器Tomcat收到Http請求,尋找相應Java Web編寫的伺服器應用程式,把請求分派給它來處理;

3.Java Web編寫的伺服器應用程式找到處理請求相應的Servlet(Java Web專案的一部分,後面會講)例項,把請求分配給它處理;

4.Servlet根據請求來執行相應的操作(如呼叫資料庫然後驗證登入是否成功),將結果新增到應答中,發回客戶端;

5.客戶端接收到應答,從應答中解析出結果(如登入是否成功),然後根據結果執行相應的邏輯(如跳轉頁面或提示賬號密碼不正確等)。

四、開始實現

實現的部分,我想分到多篇博文去講各個部分的實現及其銜接。因此,下面用我每次測試自己APP時的流程來做個索引:

2.啟動伺服器軟體和資料庫軟體

番外

更新日誌

這篇綜述和索引的博文我就寫到這了,去寫幾個分帖了,寫出來之後我會第一時間在這裡掛上連結,敬請期待。
我的這套博文應該會在兩週左右全部寫完,如果是有緊急的問題需要幫助的朋友,直接回帖或者給我發郵件,在時間充足和我會的情況下幫你解決。
——2017.05.08

實在是有些忙,今天忙裡偷閒一天,寫完了內網穿透的博文,已經在上面掛上了連結。我仔細想了一下,上面第二步可能需要三篇博文分別來講伺服器、資料庫整合開發工具包的介紹,Java Web的編寫和Tomcat的使用,之前吹牛說兩週寫完可能做不到了
——2017.05.12

今早寫了伺服器、資料庫整合開發工具包這篇文章,已經在上面掛上了連結。
——2017.05.13

今天開始寫Java Web的編寫,寫了之後才發現,這個確實挺麻煩的,各種細節需要各種截圖,已經在上面掛上了連結,沒寫完,可以先看看前面的準備部分。
——2017.05.15

今晚終於抽空寫完了Java Web的編寫,諸君可以照葫蘆畫瓢,寫自己的伺服器程式了,博文有點長,進下心來慢慢看吧,絕對有收穫!今天寫著寫著,又想到我好像沒有規劃MySQL建資料庫的部分,就在索引中添上了。
——2017.05.17

今天寫完了MySQL資料庫的建立,已經在上面掛上了連結。
——2017.05.18

今天把Tomcat的一些使用方法寫完了,寫著寫著突然忘了本來準備的內容了,略尷尬。
——2017.05.19

今天終於把原計劃的這最後一篇文章寫完了,已經在上面掛上了連結。原本計劃兩週寫完的,這都拖了將近一個多月了。但是最近真的很忙,沒辦法。

近期如果有空,我會寫一篇番外文章,講一點關於JSONObject和JSONArray的東西,應該會比較短,但是會很有用,盡請期待吧!
——2017.07.01

根據各位開發者看完這套博文之後在開發過程中的反饋,今天對《內網穿透》、《Tomcat》和《Java Web》等三帖做了一些更新。
——2018.03.11

時隔將近一年,我終於把承諾的JSONObject和JSONArray的部分寫出來了,作為進階使用的番外部分,已在上面掛上了連結。

另外,今天寫的盡興的時候,想起了Servlet分配器這個東西,作為進階內容的話還是很有意義與價值的。這次不會再跳票那麼長時間了,一兩天內完成,盡情期待!
——2018.04.12

Servlet請求分派器的博文已經寫完了,在上面掛上了連結。
——2018.04.14

鑑於做整體的系統測試的時候,很難定位Bug出在了客戶端還是服務端,我將《Tomcat的一些使用方法》這篇博文改名為《伺服器端的一些測試方法》,並在裡面添加了分享3。根據分享3,大家可以先寫服務端,不寫客戶端,服務端測試正確了再開始寫客戶端,這樣做的好處就是,我們可以更加精準的做到Bug定位了。
——2018.05.05

今天做了一個重要的調整,即《MySQL》和《JavaWeb》兩篇博文的次序,如果還是按我寫它們時的順序放在索引裡,會造成你們邏輯的顛倒,因此,調了過來。
——2018.05.11

根據近期自己在開發中的親身經歷和大家的反饋,寫了一篇收集由PC和真實伺服器環境的差異造成的Bug的博文,不光收集問題,也寫了這些問題的解決方法。大家在服務端出現Bug的時候可以點進去看看,有可能就對號入座,解決問題了,同時也鼓勵各位開發者同仁,貢獻出你們在開發過程中遇到的,各種各樣的問題及其解決方案。
——2018.05.14

後記

目前,我們的網路知識體系對Android初學者實在是太不友好了,想學習適用於Android客戶端的伺服器端程式設計,真的是太不容易。首當其衝的問題就是不好查,查到自己想要的知識相當不容易,各位大神寫的也很零散。你寫這一部分,他寫那一部分,有的時候根本拼湊不到一起。反之,查“網站伺服器端”這類的關鍵字資訊量又大,質量還都不錯。因此我說我們的網路知識體系對Android初學者實太不友好。也因此,我在自己辛苦求索,花了近半個月把這一套東西弄通之後,寫下了這一套博文。目的在於給和我處境類似的初學者們一些指引,讓他們少走一些彎路。

另外,相較於理論,我的博文更注重於應用,可能這些文章中有很多概念上說的不到位的地方,請多多包涵。

如發現了程式碼或者操作方面的錯誤,請直接回復,我會盡快修改博文,避免誤導了大家。

如果在實現中出現了自己難以解決的問題,我的郵箱是[email protected]