安卓開發,建立應用和伺服器之間聯繫的方法?

安卓開發,建立應用和伺服器之間聯繫的方法,如:賬號密碼輸入到伺服器後,使伺服器傳回信息並作出執行。


嗯嗯,這是一個非常棒的問題!

其實題主問的就是典型的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 Android

Android 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/okhttp

loopj/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用到了哪些視頻,音頻方面的框架和技術?

TAG:Android開發 | Android |