今天我们将深入介绍了Android SDK 中一些与网络有关的package,如下:
包描述

java.net 提供与联网有关的类,包括流和数据包(datagram)sockets、Internet 协议和常见 HTTP 处理。该包是一个多功能网络资源。有经验的 Java 开发人员可以立即使用这个熟悉的包创建应用程序。
java.io 虽然没有提供显式的联网功能,但是仍然非常重要。该包中的类由其他 Java 包中提供的 socket 和连接使用。它们还用于与本地文件(在与网络进行交互时会经常出现)的交互。
java.nio 包含表示特定数据类型的缓冲区的类。适合用于两个基于 Java 语言的端点之间的通信。
org.apache.* 表示许多为 HTTP 通信提供精确控制和功能的包。可以将 Apache 视为流行的开源 Web 服务器。
android.net 除核心 java.net.* 类以外,包含额外的网络访问 socket。该包包括 URI 类,后者频繁用于 Android 应用程序开发,而不仅仅是传统的联网方面
android.net.http 包含处理 SSL 证书的类。
android.net.wifi 包含在 Android 平台上管理有关 WiFi(802.11 无线 Ethernet)所有方面的类。并不是所有设备都配备了 WiFi 功能,特别是 Android 在 Motorola 和 LG 等手机制造商的 “翻盖手机” 领域获得了成功。
android.telephony.gsm 包含用于管理和发送 SMS(文本)消息的类。一段时间后,可能会引入额外的包来来为非 GSM 网络提供类似的功能,比如 CDMA 或 android.telephony.cdma 等网络。



上表并没有列出所有包,但是可以让我们清楚地意识到Android的强大功能。
介绍一个简单的网络示例

在EditView中输入URL后,单击“go!”按钮,界面显示如下



界面部分的代码简要明了,就不此额外说明了,下面详细解析核心代码,如下:

Java代码
  1. finalButtonbutton=(Button)findViewById(R.id.ButtonGo);
  2. button.setOnClickListener(newButton.OnClickListener(){
  3. publicvoidonClick(Viewv){
  4. try{
  5. tView.setText(”");
  6. //获取输入的URL地址
  7. URLurl=newURL(eText.getText().toString());
  8. URLConnectionconn=url.openConnection();
  9. //获取网页数据流
  10. BufferedReaderrd=
  11. newBufferedReader(newInputStreamReader(conn.getInputStream()));
  12. Stringline=“”;
  13. //读取数据
  14. while((line=rd.readLine())!=null){
  15. Messagelmsg;
  16. lmsg=newMessage();
  17. lmsg.obj=line;
  18. lmsg.what=0;
  19. //将数据显示在界面上
  20. h.sendMessage(lmsg);
  21. }
  22. }
  23. catch(Exceptione)
  24. {
  25. //输出异常信息
  26. Log.v(”Browse”,e.toString());
  27. }
  28. }
  29. });
[java] view plain copy
  1. finalButtonbutton=(Button)findViewById(R.id.ButtonGo);
  2. button.setOnClickListener(newButton.OnClickListener(){
  3. publicvoidonClick(Viewv){
  4. try{
  5. tView.setText(”");
  6. //获取输入的URL地址
  7. URLurl=newURL(eText.getText().toString());
  8. URLConnectionconn=url.openConnection();
  9. //获取网页数据流
  10. BufferedReaderrd=
  11. newBufferedReader(newInputStreamReader(conn.getInputStream()));
  12. Stringline=“”;
  13. //读取数据
  14. while((line=rd.readLine())!=null){
  15. Messagelmsg;
  16. lmsg=newMessage();
  17. lmsg.obj=line;
  18. lmsg.what=0;
  19. //将数据显示在界面上
  20. h.sendMessage(lmsg);
  21. }
  22. }
  23. catch(Exceptione)
  24. {
  25. //输出异常信息
  26. Log.v(”Browse”,e.toString());
  27. }
  28. }
  29. });



简要解析如下:URL 和 URLConnection 类共同提供与用户所选的 Web 站点的连接。BufferedReader 的一个实例负责从 Web 站点连接中读取传入的数据。每读取一行代码,文本就被附加到一个 TextView。数据并没有直接指定给 TextView,而是引入了一种设计模式,即创建一个消息对象并将该对象发送到一个处理程序的实例。这是更新 UI 的一种比较可取的方法,对可能需要同时运行多个线程的应用程序而言尤其如此。 A Handler allows you to send and process Message and Runnable objects associated with a thread’s MessageQueue,这句话简单明了,相信大家一看就完全明白了。
补充说明

以上程序,在实际运行中可能会导致异常,catch (Exception e) 输出异常信息:
java.net.SocketException: Permission denied(maybe missing INTERNET permission)
需要在AndroidManifest.xml中定义相应的权限,如下:
<uses-permission android:name=”android.permission.INTERNET” />
注意在<application>也可以定义INTERNET权限,如下:
<application android:permission=”android.permission.INTERNET”>
这种权限似乎还是会导致异常,看来两种权限除了作用的范围有所不同,具体的作用也是有些不同的,以后开发中需要注意两者的区别。


2、org.apache.http联网实现
Android使用HttpClient完成Post和Get方式的联网请求


Android联网可以采用HttpPost,HttpGet封装post请求和get请求,再使用HttpClient的excute方法发送post或者get请求并返回服务器的响应数据。

1、设置连接和读取超时时间,并新建HttpClient对象:

// 设置连接超时时间和数据读取超时时间
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams,
KeySource.CONNECTION_TIMEOUT_INT);
HttpConnectionParams.setSoTimeout(httpParams,
KeySource.SO_TIMEOUT_INT);
//新建HttpClient对象
HttpClient httpClient = new DefaultHttpClient(httpParams)

2、Get请求:

// generate get request
HttpGet get = new HttpGet(url);
// set HTTP head parameters
//Map<String, String> headers
if (headers != null)
{
Set<String> setHead = headers.keySet();
Iterator<String> iteratorHead = setHead.iterator();
while (iteratorHead.hasNext())
{
String headerName = iteratorHead.next();
String headerValue = (String) headers.get(headerName);
MyLog.d(headerName, headerValue);
get.setHeader(headerName, headerValue);
}
}
// connect
//need try catch
response = httpClient.execute(get);

3、Post请求:

HttpPost post = new HttpPost(KeySource.HOST_URL_STR);
// set HTTP head parameters
Map<String, String> headers = heads;
Set<String> setHead = headers.keySet();
Iterator<String> iteratorHead = setHead.iterator();
while (iteratorHead.hasNext())
{
String headName = iteratorHead.next();
String headValue = (String) headers.get(headName);
post.setHeader(headName, headValue);
}
/**
* 通常的HTTP实体需要在执行上下文的时候动态生成的。
* HttpClient的提供使用EntityTemplate实体类和ContentProducer接口支持动态实体。
* 内容制作是通过写需求的内容到一个输出流,每次请求的时候都会产生。
* 因此,通过EntityTemplate创建实体通常是独立的,重复性好。
*/
ContentProducer cp = new ContentProducer()
{
public void writeTo(OutputStream outstream)
throws IOException
{
Writer writer = new OutputStreamWriter(outstream,
"UTF-8");
writer.write(requestBody);
writer.flush();
writer.close();
}
};
HttpEntity entity = new EntityTemplate(cp);
post.setEntity(entity);
}
//connect ,need try catch
response = httpClient.execute(post);


4、请求Response响应处理:

if (response.getStatusLine().getStatusCode() == 200)
{
// get response xml.
/**
* 因为直接调用toString可能会导致某些中文字符出现乱码的情况。所以此处使用toByteArray
* 如果需要转成String对象,可以先调用EntityUtils.toByteArray()方法将消息实体转成byte数组,
* 在由new String(byte[] bArray)转换成字符串。
*/
byte[] bResultXml = EntityUtils.toByteArray(response
.getEntity());
if (bResultXml != null)
{
String strXml = new String(bResultXml, "utf-8");
}
}
//Todo xmlAnalysis..





3.java.net 联网详解


本篇幅我们漫游java.net包,按照网络方面的知识来逐步学习java网络编程,并给大家介绍一些小例子,边学习边写代码。
首先,IP地址

IP地址估计大家都明白,我们就直接来看java.net中的类吧。



详细介绍就不多说了,看2个简单的小例子如下:

Java代码
  1. StringGetHostAddress(StringstrHostName)
  2. {
  3. InetAddressaddress=null;
  4. try
  5. {
  6. address=InetAddress.getByName(strHostName);
  7. }
  8. catch(UnknownHostExceptione)
  9. {
  10. System.out.println(e.getMessage());
  11. }
  12. returnInetAddress.getHostAddress();
  13. }
  14. voidGetAllIP(StringstrHostName)
  15. {
  16. InetAddress[]add=null;
  17. try
  18. {
  19. add=InetAddress.getAllByName(strHostName);
  20. for(inti=0;i<addr.lenth;i++)
  21. System.out.println(addr[i]);
  22. }
  23. catch(UnknownHostExceptione)
  24. {
  25. System.out.println(e.getMessage());
  26. }
  27. }
[java] view plain copy
  1. StringGetHostAddress(StringstrHostName)
  2. {
  3. InetAddressaddress=null;
  4. try
  5. {
  6. address=InetAddress.getByName(strHostName);
  7. }
  8. catch(UnknownHostExceptione)
  9. {
  10. System.out.println(e.getMessage());
  11. }
  12. returnInetAddress.getHostAddress();
  13. }
  14. voidGetAllIP(StringstrHostName)
  15. {
  16. InetAddress[]add=null;
  17. try
  18. {
  19. add=InetAddress.getAllByName(strHostName);
  20. for(inti=0;i<addr.lenth;i++)
  21. System.out.println(addr[i]);
  22. }
  23. catch(UnknownHostExceptione)
  24. {
  25. System.out.println(e.getMessage());
  26. }
  27. }



上面2个小例子很简单,但是有一点必须说明的,在写网络编程方面的,必须注意异常的捕获,网络异常是比较正常的现象,比如说当前网 络繁忙,网络连接 超时,更是“家常便饭”。因此在写网络编程的时候,必须养成捕获异常的好习惯,查看完函数说明后,必须要注意网络异常的说明。例如下图中的说明:

public static InetAddress getByAddress (byte[] ipAddress)
Since: API Level 1

Returns the InetAddress corresponding to the array of bytes. In the case of an IPv4 address there must be exactly 4 bytes and for IPv6 exactly 16 bytes. If not, an UnknownHostException is thrown.

The IP address is not validated by a name service.

The high order byte is ipAddress[0].
Parameters
ipAddress is either a 4 (IPv4) or 16 (IPv6) byte long array.
Returns

* an InetAddress instance representing the given IP address ipAddress.

Throws
UnknownHostException if the given byte array has no valid length.



在使用getByAddress ()函数的时候就必须捕获UnknownHostException这个异常。
然后,URL地址




看到这个类,不仅让我想起来MFC在网络编程方面的复杂,一个

BOOL AFXAPI AfxParseURL(LPCTSTR pstrURL, DWORD& dwServiceType,CString& strServer, CString& strObject, INTERNET_PORT& nPort);

函数,让人看起来就感觉不知道在说明,在编写MFC网络编程方面的时候一般都会自己写个URL类,而在JAVA中的直接提供了这个类,让初学者看起 来明白多了。一个简单的例子如下:

Java代码
  1. VoidEasyURL(StringstrURL)
  2. {
  3. URLurl=newURL(strURL);
  4. try
  5. {
  6. InputStreamhtml=url.openStream();
  7. intc;
  8. do{
  9. c=html.read();
  10. cf(c!=-1)System.out.println((char)c);
  11. }while(c!=-1)
  12. }
  13. catch(IOExceptione)
  14. {
  15. System.out.println(e.getMessage());
  16. }
  17. }
[java] view plain copy
  1. VoidEasyURL(StringstrURL)
  2. {
  3. URLurl=newURL(strURL);
  4. try
  5. {
  6. InputStreamhtml=url.openStream();
  7. intc;
  8. do{
  9. c=html.read();
  10. cf(c!=-1)System.out.println((char)c);
  11. }while(c!=-1)
  12. }
  13. catch(IOExceptione)
  14. {
  15. System.out.println(e.getMessage());
  16. }
  17. }




其次,套接字socket类



套接字通信的基本思想比较简单,客户端建立一个到服务器的链接,一旦连接建立了,客户端就可以往套接字里写入数据,并向服务器发送数据;反过来,服 务器读取客户端写入套接字里的数据。几乎就那样简单,也许细节会复杂些,但是基本思想就这么简单。举个简单的例子如下:

Java代码
  1. voidWebPing(StringstrURL)
  2. {
  3. try
  4. {
  5. InetAddressaddr;
  6. Socketsock=newSocket(strURL,80);
  7. Addr=sock.getInetAddress();
  8. System.out.println(“Conncetedto”+addr);
  9. Sock.close();
  10. }
  11. catch(IOExceptione)
  12. {
  13. System.out.println(e.getMessage());
  14. }
  15. }
[java] view plain copy
  1. voidWebPing(StringstrURL)
  2. {
  3. try
  4. {
  5. InetAddressaddr;
  6. Socketsock=newSocket(strURL,80);
  7. Addr=sock.getInetAddress();
  8. System.out.println(“Conncetedto”+addr);
  9. Sock.close();
  10. }
  11. catch(IOExceptione)
  12. {
  13. System.out.println(e.getMessage());
  14. }
  15. }



如果使用本地主机(localhost)来测试这个程序,输出结果如下:
Connceted to localhost/127.0.0.1
InetAddress.toString()的隐含调用(println调用)自动输出主机名和IP地址。

至于其他套接字:DatagramSocket (通过UDP通信的套接字),MulticastSocket (一 种用于多点传送的套接字)以及ServerSocket (一种用于监听来自客户端的连接的套接字),在这里就不一一说 明。
最后,URLConncetion类

在一般情况下,URL这个类就可以满足我们的需求,但是在一些特殊情况下,比如HTTP数据头的传递,这个时候我们就得使用 URLConncetion,如下图所示:



使用URLConncetion,我们对网络的控制就增加了很多,举个例子如下:

Java代码
  1. voidSendRequest(StringstrURL)
  2. {
  3. URLurl=URL(strURL);
  4. HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
  5. conn.setDoInput(true);
  6. conn.setDoOutput(true);
  7. conn.setRequestProperty(“Content-type”,”application/xxx”);
  8. conn.connect();
  9. System.out.println(Conn.getResponseMessage());
  10. InputMessageis=Conn.getIputStream();
  11. intc;
  12. do{
  13. c=is.read();
  14. if(c!=-1)System.out.println((char)c);
  15. }while(c!=-1)
  16. }
[java] view plain copy
  1. voidSendRequest(StringstrURL)
  2. {
  3. URLurl=URL(strURL);
  4. HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
  5. conn.setDoInput(true);
  6. conn.setDoOutput(true);
  7. conn.setRequestProperty(“Content-type”,”application/xxx”);
  8. conn.connect();
  9. System.out.println(Conn.getResponseMessage());
  10. InputMessageis=Conn.getIputStream();
  11. intc;
  12. do{
  13. c=is.read();
  14. if(c!=-1)System.out.println((char)c);
  15. }while(c!=-1)
  16. }




关于HTTP数据头方面的知识,前段时间在编写流媒体下载的时候学习了下HTTP数据头的结构,下面列举一个HTTP request/response的一个完整流程如下,有兴趣的可以看下:

1. 概要

本文主要介绍在Android平台上开发网络应用的一些常用接口。

2. Android平台上可以使用的几种网络接口

Android平台的网络应用绝大部分都是基于Java的编程接口的,也就是说我们开发类似的运用的时候可以有多种选择,比J2me确实好多了。

2.1. 标准Java接口

java.net.*下面提供了访问 HTTP 服务的基本功能。使用这部分接口的基本操作主要包括:

· 创建 URL 以及 URLConnection / HttpURLConnection 对象

· 设置连接参数

· 连接到服务器

· 向服务器写数据

· 从服务器读取数据

import java.io.InputStream;

import java.io.OutputStream;

import java.net.URL;

import java.net.URLConnection;

import java.net.HttpURLConnection;



try {

// 创建一个 URL 对象

URL url = new URL(your_url);



// 创建一个 URL 连接,如果有代理的话可以指定一个代理。

URLConnection connection = url.openConnection(Proxy_yours);

// 对于 HTTP 连接可以直接转换成 HttpURLConnection,

// 这样就可以使用一些 HTTP 连接特定的方法,如 setRequestMethod() 等

//HttpURLConnection connection =

(HttpURLConnection)url.openConnection(Proxy_yours);



// 在开始和服务器连接之前,可能需要设置一些网络参数

connection.setConnectTimeout(10000);

connection.addRequestProperty("User-Agent",

"J2me/MIDP2.0");



// 连接到服务器

connection.connect();



// 往服务器写数据,数据会暂时被放到内存缓存区中

// 如果仅是一个简单的 HTTP GET,这一部分则可以省略

OutputStream outStream = connection.getOutputStream();

ObjectOutputStream objOutput = new ObjectOutputStream(outStream);

objOutput.writeObject(new String("this is a string..."));

objOutput.flush();



// 向服务器发送数据并获取应答

InputStream in = connection.getInputStream();



// 处理数据

...



} catch (Exception e) {

// 网络读写操作往往会产生一些异常,所以在具体编写网络应用时

// 最好捕捉每一个具体以采取相应措施

}

2.2. Apache接口

Apache HttpClient 是一个开源项目,弥补了 java.net.* 灵活性不足的缺点,为客户端的HTTP编程提供高效、最新、功能丰富的工具包支持。Android 平台引入了 Apache HttpClient 的同时还提供了对它的一些封装和扩展,例如设置缺省的HTTP超时和缓存大小等。早期的 Android 曾同时包括 Commons HttpClient (org.apache.commons.httpclient.*) 和 HttpComponents (org.apache.http.client.* ),不过当前版本 (1.5) 中开发者只能使用后者,也就是说类似以下的一些类:

使用这部分接口的基本操作与 java.net.* 基本类似,主要包括:

· 创建 HttpClient 以及 GetMethod / PostMethod, HttpRequest 等对象

· 设置连接参数

· 执行 HTTP 操作

· 处理服务器返回结果

import org.apache.http.HttpEntity;

import org.apache.http.HttpHost;

import org.apache.http.HttpResponse;

import org.apache.http.auth.AuthScope;

import org.apache.http.auth.UsernamePasswordCredentials;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.conn.params.ConnRoutePNames;

import org.apache.http.params. HttpConnectionParams;

import org.apache.http.client.params. HttpClientParams;



try {

// 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)

HttpParams params = new BasicHttpParams();



// 设置连接超时和 Socket 超时,以及 Socket 缓存大小

HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);

HttpConnectionParams.setSoTimeout(params, 20 * 1000);

HttpConnectionParams.setSocketBufferSize(params, 8192);



// 设置重定向,缺省为 true

HttpClientParams.setRedirecting(params, true);



// 设置 user agent

HttpProtocolParams.setUserAgent(params, userAgent);



// 创建一个 HttpClient 实例

// 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient

// 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient

HttpClient httpClient = new DefaultHttpClient(params);



// 创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向

HttpGet httpGet = new HttpGet ("http://www.test_test.com/");



HttpResponse response = client.execute(httpGet);

if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

// 错误处理,例如可以在该请求正常结束前将其中断

httpGet.abort();

}



// 读取更多信息

Header[] headers = response.getHeaders();

HttpEntity entity = response.getEntity();

Header header = response.getFirstHeader("Content-Type");

} catch (Exception ee) {

//

} finally {

// 释放连接

client.getConnectionManager().shutdown();

}

import org.apache.http.HttpEntity;

import org.apache.http.HttpHost;

import org.apache.http.HttpResponse;

import org.apache.http.auth.AuthScope;

import org.apache.http.auth.UsernamePasswordCredentials;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.conn.params.ConnRoutePNames;

import org.apache.http.params. HttpConnectionParams;

import org.apache.http.client.params. HttpClientParams;

try {

// 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)

HttpParams params = new BasicHttpParams();

// 设置连接超时和 Socket 超时,以及 Socket 缓存大小

HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);

HttpConnectionParams.setSoTimeout(params, 20 * 1000);

HttpConnectionParams.setSocketBufferSize(params, 8192);

// 设置重定向,缺省为 true

HttpClientParams.setRedirecting(params, true);

// 设置 user agent

HttpProtocolParams.setUserAgent(params, userAgent);



// 创建一个 HttpClient 实例

// 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient

// 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient

HttpClient httpClient = new DefaultHttpClient(params);

// 创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向

HttpGet httpGet = new HttpGet ("http://www.test_test.com/");

HttpResponse response = client.execute(httpGet);

if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

// 错误处理,例如可以在该请求正常结束前将其中断

httpGet.abort();

}

// 读取更多信息

Header[] headers = response.getHeaders();

HttpEntity entity = response.getEntity();

Header header = response.getFirstHeader("Content-Type");

} catch (Exception ee) {

//

} finally {

// 释放连接

client.getConnectionManager().shutdown();

}

以下例子以 HttpGet 方式通过代理访问 HTTPS 网站:

try {

HttpClient httpClient = new HttpClient();



// 设置认证的数据

httpClient.getCredentialsProvider().setCredentials(

new AuthScope("your_auth_host", 80, "your_realm"),

new UsernamePasswordCredentials("username", "password"));



// 设置服务器地址,端口,访问协议

HttpHost targetHost = new HttpHost("www.test_test.com", 443, "https");



// 设置代理

HttpHost proxy = new HttpHost("192.168.1.1", 80);

httpClient.getParams().setParameter

(ConnRoutePNames.DEFAULT_PROXY, proxy);



// 创建一个 HttpGet 实例

HttpGet httpGet = new HttpGet("/a/b/c");



// 连接服务器并获取应答数据

HttpResponse response = httpClient.execute(targetHost, httpGet);



// 读取应答数据

int statusCode = response.getStatusLine().getStatusCode();

Header[] headers = response.getHeaders();

HttpEntity entity = response.getEntity();

} catch (Exception ee) {

关键字: android net

1.概要

本文主要介绍在Android平台上开发网络应用的一些常用接口。

2. Android平台上可以使用的几种网络接口

Android平台的网络应用绝大部分都是基于Java的编程接口的,也就是说我们开发类似的运用的时候可以有多种选择,比J2me确实好多了。

2.1.标准Java接口

java.net.*下面提供了访问HTTP服务的基本功能。使用这部分接口的基本操作主要包括:

  • 创建URL以及URLConnection / HttpURLConnection对象
  • 设置连接参数
  • 连接到服务器
  • 向服务器写数据
  • 从服务器读取数据

importjava.io.InputStream;

importjava.io.OutputStream;

importjava.net.URL;

importjava.net.URLConnection;

importjava.net.HttpURLConnection;

try{

//创建一个URL对象

URLurl=newURL(your_url);

//创建一个URL连接,如果有代理的话可以指定一个代理。

URLConnectionconnection=url.openConnection(Proxy_yours);

//对于HTTP连接可以直接转换成HttpURLConnection,

//这样就可以使用一些HTTP连接特定的方法,如setRequestMethod()等

//HttpURLConnectionconnection=

(HttpURLConnection)url.openConnection(Proxy_yours);

//在开始和服务器连接之前,可能需要设置一些网络参数

connection.setConnectTimeout(10000);

connection.addRequestProperty("User-Agent",

"J2me/MIDP2.0");

//连接到服务器

connection.connect();

//往服务器写数据,数据会暂时被放到内存缓存区中

//如果仅是一个简单的HTTPGET,这一部分则可以省略

OutputStreamoutStream=connection.getOutputStream();

ObjectOutputStreamobjOutput=newObjectOutputStream(outStream);

objOutput.writeObject(newString("thisisastring..."));

objOutput.flush();

//向服务器发送数据并获取应答

InputStreamin=connection.getInputStream();

//处理数据

...

}catch(Exceptione){

//网络读写操作往往会产生一些异常,所以在具体编写网络应用时

//最好捕捉每一个具体以采取相应措施

}

2.2. Apache接口

Apache HttpClient是一个开源项目,弥补了java.net.*灵活性不足的缺点,为客户端的HTTP编程提供高效、最新、功能丰富的工具包支持。Android平台引入了Apache HttpClient的同时还提供了对它的一些封装和扩展,例如设置缺省的HTTP超时和缓存大小等。早期的Android曾同时包括Commons HttpClient(org.apache.commons.httpclient.*)和HttpComponents(org.apache.http.client.*),不过当前版本(1.5)中开发者只能使用后者,也就是说类似以下的一些类:

使用这部分接口的基本操作与java.net.*基本类似,主要包括:

  • 创建HttpClient以及GetMethod / PostMethod,HttpRequest等对象
  • 设置连接参数
  • 执行HTTP操作
  • 处理服务器返回结果

importorg.apache.http.HttpEntity;

importorg.apache.http.HttpHost;

importorg.apache.http.HttpResponse;

importorg.apache.http.auth.AuthScope;

importorg.apache.http.auth.UsernamePasswordCredentials;

importorg.apache.http.client.methods.HttpGet;

importorg.apache.http.conn.params.ConnRoutePNames;

importorg.apache.http.params.HttpConnectionParams;

importorg.apache.http.client.params.HttpClientParams;

try{

//创建HttpParams以用来设置HTTP参数(这一部分不是必需的)

HttpParamsparams=newBasicHttpParams();

//设置连接超时和Socket超时,以及Socket缓存大小

HttpConnectionParams.setConnectionTimeout(params,20*1000);

HttpConnectionParams.setSoTimeout(params,20*1000);

HttpConnectionParams.setSocketBufferSize(params,8192);

//设置重定向,缺省为true

HttpClientParams.setRedirecting(params,true);

//设置useragent

HttpProtocolParams.setUserAgent(params,userAgent);

//创建一个HttpClient实例

//注意HttpClienthttpClient=newHttpClient();是CommonsHttpClient

//中的用法,在Android1.5中我们需要使用Apache的缺省实现DefaultHttpClient

HttpClienthttpClient=newDefaultHttpClient(params);

//创建HttpGet方法,该方法会自动处理URL地址的重定向

HttpGethttpGet=newHttpGet("http://www.test_test.com/");

HttpResponseresponse=client.execute(httpGet);

if(response.getStatusLine().getStatusCode()!=HttpStatus.SC_OK){

//错误处理,例如可以在该请求正常结束前将其中断

httpGet.abort();

}

//读取更多信息

Header[]headers=response.getHeaders();

HttpEntityentity=response.getEntity();

Headerheader=response.getFirstHeader("Content-Type");

}catch(Exceptionee){

//

}finally{

//释放连接

client.getConnectionManager().shutdown();

}

import org.apache.http.HttpEntity;

import org.apache.http.HttpHost;

import org.apache.http.HttpResponse;

import org.apache.http.auth.AuthScope;

import org.apache.http.auth.UsernamePasswordCredentials;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.conn.params.ConnRoutePNames;

import org.apache.http.params. HttpConnectionParams;

import org.apache.http.client.params. HttpClientParams;

try {

//创建HttpParams以用来设置HTTP参数(这一部分不是必需的)

HttpParams params = new BasicHttpParams();

//设置连接超时和Socket超时,以及Socket缓存大小

HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);

HttpConnectionParams.setSoTimeout(params, 20 * 1000);

HttpConnectionParams.setSocketBufferSize(params, 8192);

//设置重定向,缺省为true

HttpClientParams.setRedirecting(params, true);

//设置user agent

HttpProtocolParams.setUserAgent(params, userAgent);

//创建一个HttpClient实例

//注意HttpClient httpClient = new HttpClient();是Commons HttpClient

//中的用法,在Android 1.5中我们需要使用Apache的缺省实现DefaultHttpClient

HttpClient httpClient = new DefaultHttpClient(params);

//创建HttpGet方法,该方法会自动处理URL地址的重定向

HttpGet httpGet = new HttpGet ("http://www.test_test.com/");

HttpResponse response = client.execute(httpGet);

if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

//错误处理,例如可以在该请求正常结束前将其中断

httpGet.abort();

}

//读取更多信息

Header[] headers = response.getHeaders();

HttpEntity entity = response.getEntity();

Header header = response.getFirstHeader("Content-Type");

} catch (Exception ee) {

//

} finally {

//释放连接

client.getConnectionManager().shutdown();

}

以下例子以HttpGet方式通过代理访问HTTPS网站:

try{

HttpClienthttpClient=newHttpClient();

//设置认证的数据

httpClient.getCredentialsProvider().setCredentials(

newAuthScope("your_auth_host",80,"your_realm"),

newUsernamePasswordCredentials("username","password"));

//设置服务器地址,端口,访问协议

HttpHosttargetHost=newHttpHost("www.test_test.com",443,"https");

//设置代理

HttpHostproxy=newHttpHost("192.168.1.1",80);

httpClient.getParams().setParameter

(ConnRoutePNames.DEFAULT_PROXY,proxy);

//创建一个HttpGet实例

HttpGethttpGet=newHttpGet("/a/b/c");

//连接服务器并获取应答数据

HttpResponseresponse=httpClient.execute(targetHost,httpGet);

//读取应答数据

intstatusCode=response.getStatusLine().getStatusCode();

Header[]headers=response.getHeaders();

HttpEntityentity=response.getEntity();

}catch(Exceptionee){

更多相关文章

  1. Android弹幕实现:基于B站弹幕开源系统(2)
  2. android数据存取的四种方式
  3. Android(安卓)应用程序之间数据共享 - ContentProvider
  4. Android从零开始搭建MVVM架构(4)——LiveData
  5. Android(安卓)kxml解析WBXML
  6. Android:(14)ContentProvider数据模型概述
  7. Android(安卓)数据库SQLiteDatabase的使用
  8. 安卓开发日记--2017.10.10
  9. Android(安卓)SQLite使用详解和多线程并发访问

随机推荐

  1. Android表格控件动态生成表格
  2. Android Spinner填充数据后设置默认值
  3. 使用Android Studio3.0新功能,加快Android
  4. Eclipse+Android解决SDK下无doc文件夹问
  5. 升级SDK后,出现这个:This Android(安卓)SDK
  6. Android Studio修改默认.gitignore模板
  7. android获取摄像头视频帧数据
  8. 如何测试APK是否设置android:debuggable=
  9. Android之EditText不自动获取焦点
  10. Android中点击事件的四种写法