`

android网络编程_ http

 
阅读更多

Android 如何使用Http协议访问网络

 

     Android使用Http协议访问网络主要有两种方式,一个是使用 java.net.*(标准Java接口),另一个是使用 Org.apache接口

     java.net.*:中是可以认为是JDK中的java网络处理包,提供了流,Socket,网络协议等常见网络相关类。

     Apache HttpClient:是一个开源项目,功能相对与JDK中的更加完善,可以为客户端提供高效丰富的Http编程支持

 

一:使用java.net包来进行Http协议的网络编程

public class CustomHttpURLConnection {
	private static String TAG = "CustomHttpUrlConnection";
	//代表 客户端与服务器之间的一个Http连接
	private static HttpURLConnection conn;
	
	public CustomHttpURLConnection() {
	}

	/**
	 * 向服务器发送Get请求
	 * @param strUrl 发送Get请求的url地址
	 * @param nameValuePairs get请求参数
	 * @return
	 */
	public static String GetFromWebByHttpUrlConnection(String strUrl,
			NameValuePair... nameValuePairs) {
		String result="";
		try {
			//1.新建Url对象
			URL url = new URL(strUrl);
			//2.获取并设置HttpURLConnection对象
			conn = (HttpURLConnection) url.openConnection();
			conn.setDoInput(true);
			conn.setConnectTimeout(3000);
			conn.setReadTimeout(4000);
			conn.setRequestProperty("accept", "*/*");
			//3.连接服务器
			conn.connect();
			//4.从建立好的连接中获取inputStream
			InputStream stream=conn.getInputStream();
			//5.为了更好的读取inputStream中的数据,包装inputStream
			InputStreamReader inReader=new InputStreamReader(stream);
			BufferedReader buffer=new BufferedReader(inReader);
			//6.开始读取数据
			String strLine=null;
			while((strLine=buffer.readLine())!=null)
			{
				result+=strLine;
			}
			//7.关闭出入流
			inReader.close();
			//8.关闭连接
			conn.disconnect();
			
			return result;
		} catch (MalformedURLException e) {
			Log.e(TAG, "getFromWebByHttpUrlCOnnection:"+e.getMessage());
			e.printStackTrace();
			return null;
		} catch (IOException e) {
			Log.e(TAG, "getFromWebByHttpUrlCOnnection:"+e.getMessage());
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 向服务器发送Post请求
	 * @param strUrl
	 * @param nameValuePairs
	 * @return
	 */
	public static String PostFromWebByHttpURLConnection(String strUrl,
			NameValuePair... nameValuePairs) {
		String result="";
		try {
			URL url = new URL(strUrl);
			conn = (HttpURLConnection) url
					.openConnection();
			// 设置是否从httpUrlConnection读入,默认情况下是true; 
			conn.setDoInput(true);
			// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在   
			// http正文内,因此需要设为true, 默认情况下是false; 
			conn.setDoOutput(true);
			// 设定请求的方法为"POST",默认是GET 
			conn.setRequestMethod("POST");
			//设置超时
			conn.setConnectTimeout(3000);
			conn.setReadTimeout(4000);
			// Post 请求不能使用缓存 
			conn.setUseCaches(false);
			conn.setInstanceFollowRedirects(true);
			// 设定传送的内容类型是可序列化的java对象   
			// (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)  
			conn.setRequestProperty("Content-Type",
					"application/x-www-form-urlencoded");
			// 连接,从上述第2条中url.openConnection()至此的配置必须要在connect之前完成,
			conn.connect();
			
			InputStream in = conn.getInputStream();
			InputStreamReader inStream=new InputStreamReader(in);
			BufferedReader buffer=new BufferedReader(inStream);
			String strLine=null;
			while((strLine=buffer.readLine())!=null)
			{
				result+=strLine;
			}
			return result;
		} catch (IOException ex) {
			Log.e(TAG,"PostFromWebByHttpURLConnection:"+ ex.getMessage());
			ex.printStackTrace();
			return null;
		}
	}

}

 

 

二:使用Apache HttpClient

 

public class CustomHttpClient {
	private static String TAG = "CustomHttpClient";
	private static final CommonLog log = LogFactory.createLog();
	private static final String CHARSET_UTF8 = HTTP.UTF_8;
	private static final String CHARSET_GB2312 = "GB2312";
	private static HttpClient customerHttpClient;

	private CustomHttpClient() {

	}

	/**
	 * HttpClient post方法
	 * 
	 * @param url
	 * @param nameValuePairs
	 * @return
	 */
	public static String PostFromWebByHttpClient(Context context, String url,
			NameValuePair... nameValuePairs) {
		try {
			List<NameValuePair> params = new ArrayList<NameValuePair>();
			if (nameValuePairs != null) {
				for (int i = 0; i < nameValuePairs.length; i++) {
					params.add(nameValuePairs[i]);
				}
			}
			UrlEncodedFormEntity urlEncoded = new UrlEncodedFormEntity(params,
					CHARSET_UTF8);
			HttpPost httpPost = new HttpPost(url);
			httpPost.setEntity(urlEncoded);
			HttpClient client = getHttpClient(context);
			HttpResponse response = client.execute(httpPost);
			if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
				throw new RuntimeException("请求失败");
			}
			HttpEntity resEntity = response.getEntity();
			return (resEntity == null) ? null : EntityUtils.toString(resEntity,
					CHARSET_UTF8);
		} catch (UnsupportedEncodingException e) {
			Log.w(TAG, e.getMessage());
			return null;
		} catch (ClientProtocolException e) {
			Log.w(TAG, e.getMessage());
			return null;
		} catch (IOException e) {
			throw new RuntimeException(context.getResources().getString(
					R.string.httpError), e);
		} 
	}

	public static String getFromWebByHttpClient(Context context, String url,
			NameValuePair... nameValuePairs) throws Exception{
			log.d("getFromWebByHttpClient url = " + url);
		try {
			// http地址
			// String httpUrl =
			// "http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get";
			StringBuilder sb = new StringBuilder();
			sb.append(url);
			if (nameValuePairs != null && nameValuePairs.length > 0) {
				sb.append("?");
				for (int i = 0; i < nameValuePairs.length; i++) {
					if (i > 0) {
						sb.append("&");
					}
					sb.append(String.format("%s=%s",
							nameValuePairs[i].getName(),
							nameValuePairs[i].getValue()));
				}
			}
			// HttpGet连接对象
			HttpGet httpRequest = new HttpGet(sb.toString());
			// 取得HttpClient对象
			HttpClient httpclient = getHttpClient(context);
			// 请求HttpClient,取得HttpResponse
			HttpResponse httpResponse = httpclient.execute(httpRequest);
			// 请求成功
			if (httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
				throw new RuntimeException(context.getResources().getString(
						R.string.httpError));
			}
			return EntityUtils.toString(httpResponse.getEntity());
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(context.getResources().getString(
					R.string.httpError),e);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			log.e("IOException ");
			e.printStackTrace();
			throw new RuntimeException(context.getResources().getString(
					R.string.httpError),e);
		} 	
	}

	/**
	 * 创建httpClient实例
	 * 
	 * @return
	 * @throws Exception
	 */
	private static synchronized HttpClient getHttpClient(Context context) {
		if (null == customerHttpClient) {
			HttpParams params = new BasicHttpParams();
			// 设置一些基本参数
			HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
			HttpProtocolParams.setContentCharset(params, CHARSET_UTF8);
			HttpProtocolParams.setUseExpectContinue(params, true);
			HttpProtocolParams
					.setUserAgent(
							params,
							"Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) "
									+ "AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");
			// 超时设置
			/* 从连接池中取连接的超时时间 */
			ConnManagerParams.setTimeout(params, 1000);
			/* 连接超时 */
			int ConnectionTimeOut = 3000;
			if (!HttpUtils.isWifiDataEnable(context)) {
				ConnectionTimeOut = 10000;
			}
			HttpConnectionParams
					.setConnectionTimeout(params, ConnectionTimeOut);
			/* 请求超时 */
			HttpConnectionParams.setSoTimeout(params, 4000);
			// 设置我们的HttpClient支持HTTP和HTTPS两种模式
			SchemeRegistry schReg = new SchemeRegistry();
			schReg.register(new Scheme("http", PlainSocketFactory
					.getSocketFactory(), 80));
			schReg.register(new Scheme("https", SSLSocketFactory
					.getSocketFactory(), 443));

			// 使用线程安全的连接管理来创建HttpClient
			ClientConnectionManager conMgr = new ThreadSafeClientConnManager(
					params, schReg);
			customerHttpClient = new DefaultHttpClient(conMgr, params);
		}
		return customerHttpClient;
	}
}

 

 

 

 

 

 

分享到:
评论

相关推荐

    HttpGet.rar_Android httpget_HttpGet android_android_httpget_http

    在这个项目"HttpGet.rar_Android httpget_HttpGet android_android_httpget_http"中...通过实践这个项目,你可以深化对Android网络编程的理解,同时熟悉`HttpClient`的使用,这对于构建需要网络交互的应用非常有帮助。

    android 网络编程简介

    1. Android网络编程概述 Android网络编程是指在Android平台上开发能够处理网络请求的应用程序的编程实践。这通常涉及实现客户端与服务器之间的数据交换,使用不同的网络协议如HTTP/HTTPS以及进行网络状态监控等。 2...

    Android网络编程之Http通信

    Android网络编程是移动应用开发中的一个重要组成部分,而Http通信则是网络编程中最常用的协议之一。在Android平台上,我们通常会使用HttpURLConnection或者第三方库如Apache HttpClient和OkHttp等进行Http通信。 1....

    android网络编程基础

    本节将深入探讨Android网络编程的基础知识,主要围绕Java网络编程这一核心概念展开。 首先,理解Android网络编程的基础概念至关重要。在Android中,网络操作通常在后台线程中执行,以避免阻塞主线程导致应用无响应...

    Android网络编程-聊天室开发

    ### Android网络编程——聊天室开发 #### 一、概述 Android聊天室项目是基于Socket网络编程的一个典型应用案例。通过本项目的开发,开发者可以深入了解如何利用Android设备与服务器端进行通信,实现多人在线聊天的...

    Android编程兵书_光盘源代码.PDF

    5. **网络编程**:涵盖Android中的网络请求,包括使用HttpURLConnection、HttpClient以及现代的OkHttp库进行HTTP通信,还有对JSON数据的解析和序列化。 6. **多线程与异步处理**:介绍如何在Android中进行多线程...

    Android 网络编程入门之图片下载

    本教程将引导初学者进入Android网络编程的世界,专注于图片下载这一实际应用。我们将使用Tomcat服务器来存储和提供图片,然后在Android客户端进行下载操作。 首先,理解Android的网络访问规则是至关重要的。Android...

    Android-for-Xinlang.rar_android_android 网络_android新浪微博_android网络

    本资源“Android-for-Xinlang.rar”专注于讲解如何在Android环境中构建一个简版的新浪微博客户端,涵盖了一系列关键的Android网络编程技术。以下是相关的知识点详解: 1. **Android SDK与环境搭建**:首先,你需要...

    Android_note.rar_ANDROID Note_Android_note_DEMO_androidnote

    这个压缩包对于那些刚刚接触Android开发或者希望深入理解Android应用编程的初学者来说非常有价值。 Android是一个开源的操作系统,主要应用于移动设备,如智能手机和平板电脑。它的应用程序框架允许开发者使用Java...

    android网络编程.pdf

    ### Android网络编程基础知识点 #### 一、网络状态检测 在Android开发中,为了确保应用程序能够根据当前网络环境做出响应,通常需要先检测设备的网络连接状态。这可以通过`ConnectivityManager`类来实现。 1. **...

    Android网络编程 非常适合入门

    Android网路编程代码 设计客户端和服务器端通信 适合初学者学习 当然其中包括很多其他知识点 例如基于handler的主副线程通信机制 多线程应用等 另外 对于Android入门的学习者 也是一手极好的学习资料 下载即可运行 ...

    android网络编程

    9. **API设计模式**:RESTful API是一种常见的设计模式,通过HTTP动词(GET, POST, PUT, DELETE等)来表示资源的操作,返回JSON数据,这在Android网络编程中非常常见。 10. **数据模型设计**:根据服务器返回的JSON...

    Android高级编程_高清pdf_中文版.part2

    有同学说不能解压,请仔细看看,要把所有5个压缩包一起下载,才能正常解压。绝对是高清扫描,中文版的文件。 ... ...请楼下不会下载的同学注意素质,...第13章 蓝牙、网络和wi-fi 第14章 传感器 第15章 android高级开发

    android_network_test.zip_242227com_android_android html_android

    在Android平台上进行网络测试是一项重要的任务,这涉及到应用程序的性能、稳定性和用户体验。...下面我们将详细探讨相关的...通过分析和使用其中的资源,开发者可以深入理解Android网络编程,并提升其应用的网络功能质量。

    Android_chm_document.zip_android_android api chm_document androi

    Android API是Google为开发者提供的接口集合,涵盖了Android系统的核心功能,包括用户界面、网络通信、硬件访问、多媒体处理等。学习Android API是Android开发的第一步,它让开发者能够调用系统服务,创建出功能丰富...

    Android网络编程总结

    这是关于安卓网络开发的一些源代码,是相关博客文章讲到的

    Android 4.0网络编程指南 part3

    Android网络编程

    Android_Http_服务器

    这个主题,"Android_Http_服务器",涉及到的是如何利用Android原生API来搭建一个Http服务器,而不是依赖于任何第三方库。让我们深入探讨这个话题。 首先,Android系统本身并不直接支持内置的Http服务器功能,但...

    Android_Application_Development_For_Dummies.pdf

    - **网络编程**:讲解如何使应用程序能够访问网络资源和服务。 #### 3. 高级功能与实践 - **多媒体处理**:涉及如何在应用程序中集成音频、视频等多媒体功能。 - **位置服务**:介绍如何利用 GPS 等技术为用户提供...

Global site tag (gtag.js) - Google Analytics