Android 联网功能

Android 基于 Linux® 内核,包含一组优秀的联网功能。

Android是由互联网巨头Google带头开发的,因此对网络功能的支持是必不可少的。Google的应用层采用的是Java语言。所以JAVA支持的网络编程方式Android都支持,同时Google还引入了Apache 的HTTP扩展包。另外,针对WIFI,NFC,分别提供的单独的开发API.

表 1. Android SDK 网络包

描述
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网络通信的六种方式示例代码

(1)针对TCP/IPSocket、ServerSocket
(2)针对UDPDatagramSocket、DatagramPackage。这里需要注意的是,考虑到Android设备通常是手持终端,IP都是随着上网进行分配的。不是固定的。因此开发也是有一点与普通互联网应用有所差异的。
(3)针对直接URL的HttpURLConnection
(4)Google集成了Apache HTTP客户端,可使用HTTP进行网络编程。针对HTTP,Google集成了Appache Http corehttpclient 4版本,因此特别注意Android不支持httpclient 3.x系列,而且目前并不支持Multipart(MIME),需要自行添加httpmime.jar 
(5)使用Web Service。Android可以通过开源包如jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去实现Webservice
(6) 直接使用WebView视图组件显示网页。基于WebView 进行开发,Google已经提供了一个基于chrome-lite的Web浏览器,直接就可以进行上网浏览网页。

1. 针对TCP/IP Socket、ServerSocket的形式

TCP/IP是一种协议,是一种面向连接的、可靠的协议。Socket仅仅是对TCP、UDP网络接口的封装,不涉及上层协议。TCP、UDP传输特性不同,分别适用于不同类型的应用层协议,其中TCP有连接,延时较长,能保证服务质量;UDP无连接,需要应用程序进行数据分包、延时短,效率高,数据包可能丢失或到达对端发生顺序混乱。在Socket之上可以实现这些RFC标准的应用层协议,也可以自定义实现私有的应用层协议。

在JAVA编程中, 经常使用java.net和javax.net包来开发socket程序,下面列出所有常用的类,并简单介绍。关于详细的信息请参看JAVA文档。

Java.net
Java.net.Socket                            客户端连接使用的TCP socket
Java.net.DatagramSocket        客户端和服务端共同使用的UDP socket
Java.net.ServerSocket               服务端TCP socket监听端口
Java.netInetAddress                   IP地址封装类
Java.net.DataGramPacket        通过DatagramSocket收发的数据包的封装类,包括数据和对端的IP地址、UDP端口

Javax.net
Javax.net.SocketFactory                     客户端连接使用的T CP socket
Javax.net.ServerSocketFactory        服务端TCP socket监听端口
Javax.net.ssl.SSLSocketFactory        SSL客户端Socket构造器
Javax.net.ssl.SSLServerFactory        SSL服务端监听Socket构造器

示例代码: android+socket编程实例.rar

2. 针对UDP的DatagramSocket、DatagramPackage

  • 对于UDP服务端,首先启动侦听服务,然后得到数据包进行处理,组后根据获得数据包进行反馈。
  • UDP socket没有连接的概念,因此构造完成的DatagramSocket不会发出向对端的网络连接请求,在每一个发送的UDP数据包中包含目的地址和端口。因为UDP数据不会在对端进行重新组包,因此一次发送的数据长度必须加以限制。

Socket.send(outputPacket);用于发送一个数据包;socket.receive(inputPacket);用于接收一个数据包。

2.jpg

1.jpg

3. 针对直接URL的HttpURLConnection
这个就是把请求的方式从HttpClient换成HttpURLConnection就可以了。

1) 使用 标准Java接口: 设计的类: java.net.* 
基本步骤:
1) 创建 URL 以及 URLConnection / HttpURLConnection 对象 

  • 对于 HTTP 连接可以直接转换成 HttpURLConnection,这样就可以使用一些 HTTP 连接特定的方法,如 setRequestMethod() 等:
  •    //HttpURLConnection connection =
  • (HttpURLConnection) url.openConnection(Proxy_yours);
  • 2) 设置连接参数 
    • 在开始和服务器连接之前,可能需要设置一些网络参数
  • connection.setConnectTimeout(10000);

3) 连接到服务器 

connection.connect();
4) 向服务器写数据

OutputStream outStream = connection.getOutputStream();

 ObjectOutputStream objOutput = new ObjectOutputStream(outStream);     

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

objOutput.flush();     

5)从服务器读取数据

InputStream in = connection.getInputStream();

2)使用 apache 接口:

Apache HttpClient 是一个开源项目,弥补了 java.net.* 灵活性不足的缺点, 支持客户端的HTTP编程.
使用的类包括:  org.apache.http.* 

步骤:
1) 创建 HttpClient 以及 GetMethod / PostMethod, HttpRequest 等对象;
2) 设置连接参数;
3) 执行 HTTP 操作;
4) 处理服务器返回结果.

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.
DefaultHttpClient 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();
}

3) 使用 android 接口: 
android.net.http.* 实际上是通过对 Apache 的 HttpClient 的封装来实现的一个 HTTP 编程接口,同时还提供了 HTTP 请求队列管理、以及 HTTP 连接池管理,以提高并发请求情况下(如转载网页时)的处理效率,除此之外还有网络状态监视等接口

try {
AndroidHttpClient client =
AndroidHttpClient.newInstance(“user_agent__my_mobile_browser”);
// 创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向:
HttpGet httpGet = new HttpGet ("http://www.test_test.com/");
HttpResponse response = client.execute(httpGet);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
// 错误处理...
}
//...
// 关闭连接:
client.close();
} catch (Exception ee) {
//...
}

四、Google集成了Apache HTTP客户端,可使用HTTP进行网络编程
这个不多说了,网络编程,必须会的。自己看代码吧。

  • 服务端我使用三种方式:S2SH、只用Struts2、Servlet
  • 客户端就一种,只不过换个请求的URL。
  • 服务端和客户端交互使用了两种方式:XML、JSON

目前开放平台返回的数据都是支持这两种数据格式的。所以我也实现了这两种数据格式。其实还有一种格式,就是google的protocal buffer,这种形式在国内用的人比较少,我也没弄,感兴趣的同学看我提供的文档,自己研究吧。注意把里面的IP换成自己电脑的IP地址

示例代码:
服务端:ServletTest1.rar、StrAnd.rar、WebAndroid.rar
客户端:WebAndroidClient.rar

a. 在只使用Struts2的服务器端,可以这么配置:
<package name=”struts-main” extends=”json-default” >
<action name=”*UserAction” method=”{1}”>
<result type=”json”></result>
</action>
</package>
也可以这么配置:
<package name=”struts-main” extends=”struts-default” >
<action name=”*UserAction” method=”{1}”>
<result name=”register”>/WEB-INF/page/register.jsp</result>
<result name=”save”>/WEB-INF/page/index.jsp</result>
</action>
</package>

但是其实返回数据的时候都是封装JSON字符串,没用到第一种形式的配置的功能。据说,用第一种配置方式,struts2可以自动把返回的数据封装成JSON字符串的形式,但是我没测试成功。。。。我返现返回什么格式还是什么格式,并没有把数据自动封装成JSON返回。
b. 在使用S2SH的服务端,就不能用第一种方式配置。只能用第二种方式,然后服务端封装JSON返回客户端。如果用第一种方式配置,就会发生404错误。无法找到服务器端。
c. 在使用Servlet的服务端,可以通过下面这种方式设置返回类型,但是其实没用,你设置了,它也不返回。你只能自己封装XML文件或者JSON字符串,然后返回。
response.setContentType(“application/json;charset=utf-8”);

android端和Struts2服务器端通信,交互信息,参数采用JSON,使用了HttpClient与HttpPost类

KSOAP2调用webserverice

五、使用Web Service
我之前只听说过什么是webservice,因此主要是参考下面文章实现的DEMO,他给出了一些实例代码,不全,我给基本补全了。显示天气信息我都在LOG输出了,没有显示在界面上,如果大家觉得不爽,可以把信息直接显示在界面上就可以了。因为我被这个问题困扰了2天,弄的很崩溃,所以就没继续弄。大家自己看吧。
那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。在Android中,第三方公司提供了基于webservice的jar包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar

Android与服务器端数据交互(基于SOAP协议整合android+webservice)

Android调用天气预报的WebService简单例子
示例代码:SoapAndroidTeset.rar、sserEx09.rar

六. 直接使用WebView视图组件显示网页
这就是使用webview显示网页的问题,比较容易,大家自己看吧。我就不贴实例代码了。

via 

Java网络编程

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

生活在西班牙

自己动手丰衣足食

BlueAsteroid

Just another WordPress.com site

Jing's Blog

Just another WordPress.com site

Start from here......

我的心情魔方

天才遠私廚

希望能做一個分享各種資訊的好地方

语义噪声

西瓜大丸子汤的博客

笑对人生,傲立寰宇

Just another WordPress.com site

Where On Earth Is Waldo?

A Project By Melanie Coles

the Serious Computer Vision Blog

A blog about computer vision and serious stuff

Cauthy's Blog

paper review...

Cornell Computer Vision Seminar Blog

Blog for CS 7670 - Special Topics in Computer Vision

datarazzi

Life through nerd-colored glasses

Luciana Haill

Brainwaves Augmenting Consciousness

槑烎

1,2,∞

Dr Paul Tennent

and the university of nottingham

turn off the lights, please

A bunch of random, thinned and stateless thoughts around the Web

%d bloggers like this: