首页 > 代码库 > Android:客户端通过HTTP连接服务器,完成注册并传送坐标信息

Android:客户端通过HTTP连接服务器,完成注册并传送坐标信息

一、Main.xml

      主要是2个Button和一个TextView。“设备注册”点击后即向服务器发送设备的MAC、HolderName等信息;“坐标传送”则输送设备从iBeacon获取的坐标信息到服务器,经过定位算法处理后再从服务器传回修正坐标信息(因篇幅有限,本节暂不提坐标信息是如何获取的)。下面的TextView用于实时显示状态信息。其他的View主要用于实际调试。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<LinearLayout 
		android:orientation="horizontal" android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:layout_marginTop="10dp">
		<TextView android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:text="信息交互窗口" android:textSize="16dp"
			android:layout_marginRight="10dp" />
		<EditText android:id="@+id/tvEdit" android:layout_width="fill_parent" android:text=""
			android:layout_height="wrap_content" />
	</LinearLayout>
	<Button android:id="@+id/btnGetQuery" android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:text="设备注册" />
	<Button android:id="@+id/btnPostQuery" android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:text="坐标传送" />
	<TextView android:id="@+id/tvQueryResult"
		android:layout_width="fill_parent" android:layout_height="wrap_content" />

</LinearLayout>

二、建立HTTP连接

1、NetworkService类用于建立HTTP连接。

2、url_ip为服务器IP地址,

getPostResult()方法传入的url为服务器定义的action,本文为"equipment_Register_VIPRegister_n.action"

package net.blogjava.mobile;

import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.util.EntityUtils;

import android.util.Log;


public class NetworkService {

	private static String TAG = "NetworkService";
	
	//private static String url_ip = ServerUrl.SERVER_ADRESS+"UserInfoServlet?";
	private static String url_ip = "http://192.168.1.231:8080/indoor/";
	
	/**
	 * 释放资源
	 */
	public static void cancel() {
		Log.i(TAG, "cancel!");
		// if(conn != null) {
		// conn.cancel();
		// }
	}

	//无参数传递的
		public static String getPostResult(String url){
			
			url = url_ip + url;
			//创建http请求对象
			HttpPost post = new HttpPost(url);
			
			//创建HttpParams以用来设置HTTP参数
	        BasicHttpParams httpParams = new BasicHttpParams();
			HttpConnectionParams.setConnectionTimeout(httpParams,10 * 1000);
			HttpConnectionParams.setSoTimeout(httpParams, 10 * 1000);

			//创建网络访问处理对象
			HttpClient httpClient = new DefaultHttpClient(httpParams);
			try{
				//执行请求参数??
				HttpResponse response = httpClient.execute(post);
				//判断是否请求成功
				if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
					//获得响应信息
					String content = EntityUtils.toString(response.getEntity());
					return content;
				} else {
					//网连接失败,使用Toast显示提示信息
					
				}
				
			}catch(Exception e) {
				e.printStackTrace();
				return "{\"status\":405,\"resultMsg\":\"网络超时!\"}";
			} finally {
				//释放网络连接资源
				httpClient.getConnectionManager().shutdown();
			}
			return "{\"status\":405,\"resultMsg\":\"网络超时!\"}";
			
		}
	   //有参数传递的
		public static String getPostResult(String url, List<NameValuePair> paramList){
			UrlEncodedFormEntity entity = null;
			try {
				entity = new UrlEncodedFormEntity(paramList,"utf-8");
			} catch (UnsupportedEncodingException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}	
		
			//创建http请求对象
			HttpPost post = new HttpPost(url);
			BasicHttpParams httpParams = new BasicHttpParams();
			
			HttpConnectionParams.setConnectionTimeout(httpParams, 10 * 1000);
			HttpConnectionParams.setSoTimeout(httpParams, 10 * 1000);
			post.setEntity(entity);
			//创建网络访问处理对象
			HttpClient httpClient = new DefaultHttpClient(httpParams);
			try{
				//执行请求参数??
				HttpResponse response = httpClient.execute(post);
				//判断是否请求成功
				if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
					//获得响应信息
					String content = EntityUtils.toString(response.getEntity(),"UTF-8");
					return content;
				} else {
					//网连接失败,使用Toast显示提示信息
					
				}
				
			}catch(Exception e) {
				e.printStackTrace();
				return "{\"status\":405,\"resultMsg\":\"网络超时!\"}";
			} finally {
				//释放网络连接资源
				httpClient.getConnectionManager().shutdown();
			}
			return "{\"status\":405,\"resultMsg\":\"网络超时!\"}";
			
		}
}

三、注册信息的传送

1、定义List<NameValuePair>:

List<NameValuePair> paramList = new ArrayList<NameValuePair>();
			paramList.add(new BasicNameValuePair("headTage","device"));
			paramList.add(new BasicNameValuePair("idmac",IDMAC));
			paramList.add(new BasicNameValuePair("model",MODEL));
			paramList.add(new BasicNameValuePair("holdername",HOLDERNAME));

2、调用NetworkService类里面的getPostResult()方法:

String str ="";
str = NetworkService.getPostResult(url, paramList);

3、Json解析服务器回馈的信息

(需自行下载并添加json的包)

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

try {
			JSONTokener jsonParser = new JSONTokener(result);
			JSONObject responseobj = (JSONObject) jsonParser.nextValue(); 
			if("failed".equals(responseobj.getString("errorMsg")))
			{
			tvQueryResult.setText(responseobj.getString("resul"));
					//closeHeaderOrFooter(true);
				}
				else
				{
<pre name="code" class="java">                                 tvQueryResult.setText("没有数据");
				}
			
			else {
<pre name="code" class="java"><pre name="code" class="java">                                 tvQueryResult.setText("数据获取失败");
		}
		} catch (Exception e) {
<pre name="code" class="java"><pre name="code" class="java"><pre name="code" class="java"><pre name="code" class="java">                                 tvQueryResult.setText("数据获取失败");
		}

3、因http耗时需将设备注册与左边信息传送放在异步线程里来执行,否则会报异常


//注册    class RegisterAsyncTask extends AsyncTask<String, Integer, String> {        Context myContext;        TextView tvQueryResult = (TextView) findViewById(R.id.tvQueryResult);        public RegisterAsyncTask(Context context) {            myContext = context;        }        @Override        protected String doInBackground(String... params) {            // TODO Auto-generated method stub            try {                resultData = http://www.mamicode.com/InitData();>

四、主程序

      

package net.blogjava.mobile;

import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import net.blogjava.mobile.NetworkService;

import com.pojo.DeviceInfo;
import com.pojo.PositionInput;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.content.Context;  

public class Main extends Activity implements OnClickListener
{
	private String resultData;
	DeviceInfo device =new DeviceInfo();
	
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		Button btnGetQuery = (Button) findViewById(R.id.btnGetQuery);
		Button btnPostQuery = (Button) findViewById(R.id.btnPostQuery);
		btnGetQuery.setOnClickListener(this);
		btnPostQuery.setOnClickListener(this);
	    RegisterDevice();
	}
	
	@Override
	public void onClick(View view)
	{
		
		//String url = "";
		TextView tvQueryResult = (TextView) findViewById(R.id.tvQueryResult);
	/*	HttpResponse httpResponse = null;	*/	
		try
		{
			
			switch (view.getId())
			{
				case R.id.btnGetQuery:
					tvQueryResult.setText("正在注册...");
					RegisterDevice();
					break;

				case R.id.btnPostQuery:
					tvQueryResult.setText("传送坐标信息...");
					PositionPost();
					break;
			}
		}
		catch (Exception e)
		{
			tvQueryResult.setText(e.getMessage());
		}

	}

//注册按钮执行事件
	protected void RegisterDevice(){
		//Toast.makeText(Main.this,"注册中...", 1000).show();
		//new AlertDialog.Builder(Main.this).setMessage("正在注册...").create().show();
		RegisterAsyncTask Register = new RegisterAsyncTask(this);
	    Register.execute("");
		//new AlertDialog.Builder(Main.this).setMessage("注册成功").create().show();
	}
//坐标传送按钮执行事件
	protected void PositionPost(){
		PositionPostAsyncTask PositionPost = new PositionPostAsyncTask(this);
		PositionPost.execute("");
	};
//注册
	class RegisterAsyncTask extends AsyncTask<String, Integer, String> {

		Context myContext;
		TextView tvQueryResult = (TextView) findViewById(R.id.tvQueryResult);
		public RegisterAsyncTask(Context context) {
			myContext = context;
		}

		@Override
		protected String doInBackground(String... params) {
			// TODO Auto-generated method stub
			try {
				resultData = http://www.mamicode.com/InitData();>