Android客戶端與PHP服務端通信(二)
來源:程序員人生 發布時間:2015-06-06 08:29:29 閱讀次數:2726次
概述
本節通過1個簡單的demo程序簡單的介紹Android客戶端通過JSON向PHP服務端提交定單,PHP服務端處理定單后,通過JSON返回結果給Android客戶端。正常來說,PHP服務端在處理定單進程中,需要與MySQL數據庫交互,這里為了簡單起見,暫時省掉MySQL。
通訊格式
首先,需要定下客戶端與服務端之間通訊格式,以下表

Android客戶端
客戶端與服務端采取JSON數據格式通訊,同時采取HTTP通訊協議交互,采取POST方式提交結果。同時還要注意1點,與WEB服務器通訊的進程需要另開辟1個線程進行數據的獲得,這樣可以避免獲得程序失敗以后,主線程還可以運行,我開始實驗的時候沒有注意到這1點,由于通訊失敗造成了程序停止運行。
同時由于需要網絡通訊,所以需要在AndroidManifest.xml中添加以下權限語句

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
程序的構造圖比較簡單,只有1個MainActivity.java。

運行效果為

MainActivity.java內容以下
package com.lygk.jsontest;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.protocol.HTTP;
import org.json.JSONObject;
import com.example.jsontest.R;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private static final String TAG="LYGK";
Button BtnRequest;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "啟動程序 ");
BtnRequest = (Button)findViewById(R.id.BtnRequest);
//綁定事件源和監聽器對象
BtnRequest.setOnClickListener(new ButtonRequestListener());
}
//內部類,實現OnClickListener接口
//作為第2個按鈕的監聽器類
class ButtonRequestListener implements OnClickListener
{
public void onClick(View v)
{
Log.i(TAG, "按鈕按下 ");
StartRequestFromPHP();
Log.i(TAG, "履行終了 ");
}
}
private void StartRequestFromPHP()
{
//新建線程
new Thread(){
public void run(){
try {
SendRequest();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
private void SendRequest(){
//通過HttpClient類與WEB
服務器交互
HttpClient httpClient = new DefaultHttpClient();
//定義與
服務器交互的地址
String ServerUrl = "http://www.bigbearking.com/study/guestRequest.php";
//設置讀取超時,注意CONNECTION_TIMEOUT和SO_TIMEOUT的區分
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);
//設置讀取超時
httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000);
//POST方式
HttpPost httpRequst = new HttpPost(ServerUrl);
//準備傳輸的數據
List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>();
params.add(new BasicNameValuePair("CMDID", "1"));
params.add(new BasicNameValuePair("CUserName", "lygk"));
params.add(new BasicNameValuePair("COrderName", "Apple"));
params.add(new BasicNameValuePair("COrderNum", "2"));
try{
//發送要求
httpRequst.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
//得到響應
HttpResponse response = httpClient.execute(httpRequst);
//返回值如果為200的話則證明成功的得到了數據
if(response.getStatusLine().getStatusCode() == 200)
{
StringBuilder builder = new StringBuilder();
//將得到的數據進行解析
BufferedReader buffer = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
//readLine()阻塞讀取
for(String s =buffer.readLine(); s!= null; s = buffer.readLine())
{
builder.append(s);
}
System.out.println(builder.toString());
//得到Json對象
JSONObject jsonObject = new JSONObject(builder.toString());
//通過得到鍵值對的方式得到值
int CmdId = jsonObject.getInt("CMDID");
String SResult = jsonObject.getString("SResult");
String SUserName = jsonObject.getString("SUserName");
int SResultPara = jsonObject.getInt("SResultPara");
Log.i(TAG, "讀取到數據 ");
Log.i(TAG, "RequestResult:"+SResult);
Log.i(TAG, "UserName:"+SUserName);
//在線程中判斷是不是得到成功從
服務器得到數據
}
else{
Log.e(TAG, "連接超時 ");
}
}catch (Exception e)
{
e.printStackTrace();
Log.e(TAG, "要求毛病 ");
Log.e(TAG, e.getMessage());
}
return ;
}
}
Web服務端源碼
guestRequest.php內容:
<?php
//獲得客戶端發來的要求信息
$CmdId = $_POST['CMDID'];
$UserName = $_POST['CUserName'];
$OrderName = $_POST['COrderName'];
if($UserName != 'lygk')
{
$result = 'Fail';
$resultpara = 2;
//將數據存儲到數據中
$arr = array(
'CMDID' => $CmdId,
'SUserName' => $UserName,
'SResult'=>$result,
'SResultPara' =>$resultpara
);
//將數組轉成json格式進行傳遞
$strr = json_encode($arr);
}
else
{
$result = 'Success';
$resultpara = 1;
//將數據存儲到數據中
$arr = array(
'CMDID' => $CmdId,
'SUserName' => $UserName,
'SResult'=>$result,
'SResultPara' =>$resultpara
);
//將數組轉成json格式進行傳遞
$strr = json_encode($arr);
}
echo($strr);
?>
運行軟件,點擊“發送要求”按鈕后,從LogCat可以看到運行信息,WEB服務器已成功響應處理了Android客戶端發送的要求。

結尾
本章主要介紹了Android客戶端與WEB服務真個交互,貼的源碼比較多,發現講的原理少,其中個中細節,請君自行品味查閱。Android客戶端源碼,點此下載
/*****************************************************************************************************
*原創文章,轉載請注明網址:http://blog.csdn.net/mybelief321/article/details/45423143
*魯陽高科工作室
*網 址:www.bigbearking.com
*商務合作QQ:1519190237
*業 務 范 圍:網站建設、桌面軟件開發、AndroidIOS開發、圖象影視后期處理、PCB設計
****************************************************************************************************/
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈