安卓開發,建立應用和伺服器之間聯繫的方法?
安卓開發,建立應用和伺服器之間聯繫的方法,如:賬號密碼輸入到伺服器後,使伺服器傳回信息並作出執行。
嗯嗯,這是一個非常棒的問題!
其實題主問的就是典型的Server-Client的交流方式。Server,就是所謂的伺服器,運行在本地或另外一台主機上;然後Android的應用是作為Client,通過網路跟Server端進行通信。
雖然話說的非常簡單,但其實這涉及到很多複雜的問題:
1、Android編程、Java基礎,這裡推薦我看過的一本書:《Android編程權威指南 [Android programming: the big nerd ranch guide]》。這本書甚至不要求你有太多java編程經驗,而且例子豐富,可以一個個跟著學習
2、網路通信基礎。以前上學的時候,學的就是《TCP/IP詳解》這套書,非常詳細,大概有幾卷。當然,如果沒有時間,可以去Google上以 "TCP", "HTTP", "Server Client programming tutorial 編程" 「Restful" 為關鍵字搜索一下哦!
3、以及,不要怕,多學多練,遇到不懂的就積極在網上發問吧!當然,發問前最好先自己搜索一下網上現成的答案哦~
最後,附上Stackoverflow和Quora上,關於這個問題很多網友的耐心解答 :
How to build a simple server-client based app in AndroidAndroid client server application========================
是的,我寫這個答案就是為了諷刺這些諷刺題主的回答的把知乎弄成貼吧一樣的人,不是這些問「所謂簡單問題」的題主們,而是你們這群無知傲慢的諷刺他人的答者
知乎不是你家開,每個人都有提問的權利
你覺得很弱智,沒問題,出門左轉再見
但你一定要把它頂上你的Timeline,然後嘲諷一番,只會讓你顯得無知、傲慢且幼稚
很多簡單的問題都是有意義的。No Dumb Questions
如果有時間精力,花一兩分鐘,哪怕給出再簡單地提示和引導,能夠幫助提問者以及將來千千萬萬的該類問題的初學者迅速入門,這也是一件大好事,整個社區都會感謝你以你的例子為例子
一般來說,是用HTTP請求來完成,常見的有Post或者Get,反正就是把賬號密碼啊之類的發給伺服器,伺服器再返回回來是否正確
比如get: http://xxxx.xx.com/xx.php?user=value1password=value2
post就是把參數放在請求體里
當然,其中涉及到通用數據交換格式的問題,現在常見的有json和xml
推薦一個Chrome插件,postman,可以很方便的進行測試
具體到Android的話,了解下HttpClient和HttpURLConnection
雖然前者早就被廢棄了
下面是一個具體的例子,來自Jude95,注釋什麼的都很詳盡了
public class NetUtils {
public static String post(String url, String content) {
HttpURLConnection conn = null;
try {
// 創建一個URL對象
URL mURL = new URL(url);
// 調用URL的openConnection()方法,獲取HttpURLConnection對象
conn = (HttpURLConnection) mURL.openConnection();
conn.setRequestMethod("POST");// 設置請求方法為post
conn.setReadTimeout(5000);// 設置讀取超時為5秒
conn.setConnectTimeout(10000);// 設置連接網路超時為10秒
conn.setDoOutput(true);// 設置此方法,允許向伺服器輸出內容
// post請求的參數
String data = content;
// 獲得一個輸出流,向伺服器寫數據,默認情況下,系統不允許向伺服器輸出內容
OutputStream out = conn.getOutputStream();// 獲得一個輸出流,向伺服器寫數據
out.write(data.getBytes());
out.flush();
out.close();
int responseCode = conn.getResponseCode();// 調用此方法就不必再使用conn.connect()方法
if (responseCode == 200) {
InputStream is = conn.getInputStream();
String response = getStringFromInputStream(is);
return response;
} else {
throw new NetworkErrorException("response status is "+responseCode);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.disconnect();// 關閉連接
}
}
return null;
}
public static String get(String url) {
HttpURLConnection conn = null;
try {
// 利用string url構建URL對象
URL mURL = new URL(url);
conn = (HttpURLConnection) mURL.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
conn.setConnectTimeout(10000);
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
InputStream is = conn.getInputStream();
String response = getStringFromInputStream(is);
return response;
} else {
throw new NetworkErrorException("response status is "+responseCode);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.disconnect();
}
}
return null;
}
private static String getStringFromInputStream(InputStream is)
throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
is.close();
String state = os.toString();// 把流中的數據轉換成字元串,採用的編碼是utf-8(模擬器默認編碼)
os.close();
return state;
}
}
別忘了加網路請求的許可權
前面提到的json和xml,比較常用的解析庫有來自Google的GSON和阿里的FastJson
然後注意下請求的時候要非同步進行,Handler啊,callback啊這些也是必須要掌握的
如果上面這些都會了的話。。。
試下Retrofit+ RxJava來做網路請求,套路多著呢
當然,會這些沒啥卵用,最關鍵的,還是要對http有個整體的認識。
要了解http,推薦閱讀OkHttp的源碼,包括但不限於 Socket連接池的實現,http為什麼要求連接復用,如何管理泄露連接,引用計數?; http緩存的實現,判斷新鮮度再驗證等等,頁面置換演算法LRU; 以及各種協議實現的細節比如https在應用層和傳輸層之間做了什麼事,OkHttp對請求的透明壓縮,非同步事件線程池的分發管理,類似反向代理; 如何優雅的使用責任鏈模式來最大限度的解耦,沒有這個怎麼實現失敗重連等等
這有一個Android和伺服器通信的完整的例子,題主可以看一下,看完對整個流程應該就很清晰了,至於賬號密碼的校驗,是伺服器端要做的事情,Android只需要接收伺服器端回傳的數據就ok
如何使用JSON連接Android和PHP Mysql資料庫 - WeLoveSunFlower的專欄 - 博客頻道 - CSDN.NET涉及到的知識點:JSON、AsyncTask、SQlite、ListView、HTTP、MySql
另外推薦兩個網路請求庫:square/okhttploopj/android-async-http這一大片嘲諷的我也是醉了,難道你們一生下來就會的嗎?
給樓主幾個關鍵詞,TCP UDP HTTP Socket WebSocket。
找一本計算機網路的書來看,你會豁然開朗。講道理啊,當我還是個新手的時候,我是恥於提出這樣的問題的。但是我非常贊同這是一個好問題,因為其中所涉及的知識點(網路分層、TCP、Socket、HTTP),我相信即使是在座的各位也有很多說不清的,現在的開發者中只會Okhttp、HttpClient的朋友真心不少。對於題主,急於應付項目的話,建議找個老司機給你講解一下計算機網路基礎知識,尤其是上述括弧里的幾個關鍵詞,再上網抄人家demo。認真學的話,還是這本《TCP/IP詳解卷一:協議》
題主你好,我也是一個在從運營狗走向android的菜雞,這兩天正好在學習客戶端和服務端的數據處理感覺,這個過程的主要就是 客戶端輸入信息——服務端獲取———資料庫查詢返回給服務端——進行對比——客戶端得到結果 我的做法是先通過java來實現,於是乎自己搭了一個伺服器,以及一些java代碼,具體如下,看注釋。
隨便答一下 有空了再認真回答一下(我一般都沒空)
建立安卓應用和伺服器之間聯繫的方法現在有2台可以訪問互聯網之間的設備,其中一台是公網上的伺服器,所有互聯網上的計算機都可以通過唯一的IP地址,加上伺服器開放的埠號,來訪問該埠映射的資源。此外,由於ip地址較為難記,也可以綁定一個域名到ip地址,這樣訪問域名解析完成,請求就直接訪問該ip,獲取資源。
客戶端與伺服器建立連接並獲伺服器取資源,然後將資源返回到客戶端上面,整個過程就是一次完整的網路交互。互聯網網路交互使用的協議叫做tcp/ip協議。tcp/ip協議不是tcp和ip兩個協議,而是網際網路整個的協議族。整個通信過程osi又將它分為了7層,7層中,建立連接需要關注2層,傳輸層和應用層,傳輸層有2個協議tcp和udp,應用層的協議有FTPSMTPDNSTELNET等等,每一種協議都對應了不同的內容。其他回答都是使用http協議,客戶端與伺服器進行一次連接,客戶端發送請求到伺服器,伺服器處理後返回信息,客戶端收到信息,斷開鏈接,連接完成。http協議是所有www文件都需要遵循的標準,每一次客戶端發送請求,包含請求行、消息報頭、請求正文,請求行中較為重要的是請求方法,共有八種,最常見的是GET和POST,get一般用於簡單信息,post用於數據較多的信息傳輸,post比get擁有更好的安全性,get多用於信息獲取,post數據則多用於更新伺服器上的內容。為了便於開發,很多人封裝了HTTP相關API,。。。。然而,通訊雙方的連接除了一次的短連接,還有長連接。
http協議也可以進行長連接,短連接只用處理一次連接的信息,不用向長連接一直保存著連接,等待多次數據交互完成再關閉連接。所以,現在可以得出提問者需要的最簡單的答案了,客戶端與伺服器建立連接最簡單的方法就是使用http協議,場景:「賬號密碼輸入到伺服器後,使伺服器傳回信息並作出執行。」應該修改為:賬號密碼在客戶端輸入後,客戶端發送請求到伺服器,伺服器校驗完成,返回信息。最簡單的就是使用http協議發送一次post請求。「伺服器傳回信息並作出執行」,伺服器已經傳回信息,執行與否與客戶端無關。
題外:本人是一個充滿正義感且有主見偏激的人。
針對這個問題和諸多回答評論也有自己的看法:以下是針對:hi大頭鬼hi 的回答的評論列表:對於客戶端,可以用okhttp。已經封裝得比較好了
下面的大神們已經普及了基礎,我就推薦基本書吧,android網路開發從入門到精通,android網路編程抱歉,只記得這兩本,樓主感興趣自己可以看看
試用http協議交互
目前用的第三方開發框架,kjframe,裡面有封裝好的http請求,圖片載入,控制項綁定,個人感覺挺好用的
哪些嘲諷的人 你們的優越感從何而來!看不起小白是吧!
推薦閱讀:
※Android 程序猿如何繼續深入的研究技術層的知識?請教各位前輩指條明路
※自學Android開發掌握基礎之後如何快速進階,需要哪些能力才能拿到大公司的offer?
※能否實現一種中間件將 iOS、Android、Windows Phone 7 上任意平台開發的軟體在其他平台也能運行?
※鬥魚,熊貓APP 這類APP用到了哪些視頻,音頻方面的框架和技術?