android三种⽹络通信接⼝及各个接⼝的代码⽰例
第⼀部分 Android⽹络基础
Android平台浏览器采⽤了WeBKit引擎,这款名为Chorme Lite的Web浏览器拥有强⼤扩展特性,每个开发者都以为编写⾃⼰的插件,使得浏览器的功能更加完善。
⽬前Android平台有3种⽹络接⼝。
第⼀种 java.*(标准java接⼝)
此接⼝提供与联⽹有关的类,包括流和数据包套接字、Internet协议、常见HTTP处理。如:创建URL以及URLConnection/HttpURLConnection对象、设置连接参数、连接服务器、向服务器写
数据、从服务器读取数据等通信。
下例为常见java包的Http例⼦:
try{
URL url = new URL("定义地址
HttpURLConnection http = (HttpURLConnection) url.openConnection();//打开连接
int nRC = ResponseCode();//得到连接状态
if(nRC == HttpURLConnection.HTTP_OK){
InputStream is = InputStream();//取得数据
.....//处理数据
}
}catch(Exception e){
//因是连接⽹络,不免会出现⼀些异常,所以必须处理这些异常
}
第⼆种 Apache接⼝
Android提供的Apache HttpClient,它是⼀个开源项⽬,功能更加完善,为客户端的Http编程提供⾼效、最新、功能丰富的⼯具包。
Android⽬前使⽤的是HttpClient4.0(org.apache.http.*),可将Apache看为⽬前流⾏的开源Web服务器,主要包括创建HttpClient以及Get/Post、HttpRequest等对象,设置连接参数,执⾏HTTP操作,
处理服务器返回结果等功能。
下例为使⽤android.http.*包的例⼦:
try{
HttpClient hc = new DefaultHttpClient();//创建HttpClient,这⾥使⽤DefaultHttpClient表⽰默认属性
HttpGet hg = new HttpGet("实例
HttpResponse rp = hc.execute(hg);//连接
StatusLine().getStatusCode() == HttpStatus.SC_OK){
InputStream is = rp.getEntity().getContent();
.....//处理数据
}
}catch(IOEeception e){
}
第三种 Android⽹络接⼝
android.*包实际是通过Apache中HttpClient的封装来实现的⼀个HTTP编程接⼝,同时还提供了Http请求队列管理以及Http连接池管理,以提⾼并发请求情况下(如装载⽹页时)的效率
还包括⽹络状态监视等接⼝,⽹络访问的Socket,常⽤的Uri类以及有关WiFi相关的类等等。
下例为最简单的Socket连接
try{
InetAddress ia = ByName("192.168.1.110");//IP地址
Socket sk = new Socket(inetAddress,61203,true);//端⼝
InputStream is =sk.getInputStream();//得到数据
OutputStream os = sk.getOutputStream();
.....//数据处理
os.close();
is.close();
sk.close();
}catch(UnknownHostException e){
}catch(IOException e){
}
第⼆部分 Http通信
Android提供了HttpURLConnection和HttpClient接⼝来开发Http程序。
Http(Hyper Text Transfer Protocol,超⽂本传输协议)⽤于传输WWW⽅式的数据。
HTTP通信中客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建⽴连接到关闭连接的过程为"⼀次连接"。要保证客户端程序在线状态,需要不断地向
服务器发送连接请求。通常的做法是即使不需要获得任何数据,客户端也保持没隔⼀段固定的时间向服务器发送⼀次“保持连接”的请求,服务器在收到该请求后对客户端进⾏回复,表明
知道客户端在线。若长时间⽆法收到客户端的请求,则认为客户端下线,若客户端长时间⽆法收到服务器的回复,则认为⽹络已经断开。很多情况下,需要服务器端主动向客户端发送数据
以保持客户端与服务器数据的实时与同步。Http通信中,服务器需要等到客户端发送⼀次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,
同时也是在"询问"服务器是否有新数据,如果有就将数据传给客户端。
Http采⽤请求/响应的模式。客户端向服务器发送⼀个请求,请求头包含了请求⽅法,URI,协议版本,以及包含请求修饰符,客户信息和内容,类似于MIME 消息结构。服务器以⼀个状态⾏作
为响应,响应的内容包含消息协议的版本,成功或错误编码,还包含服务器消息,实体元信息以及可能的实体内容。它是⼀个属于应⽤层的⾯向对象的协议,适⽤于分布式超媒体信息系统。
许多HTTP通信是由⼀个⽤户代理初始化的,并且包括⼀个申请在源服务器上资源的请求。最简单的情况可能是在⽤户代理和服务器之间通过⼀个单独的连接来完成。
在Internet上,Http通信通常发⽣在TCP/IP连接上,缺省端⼝是TCP80.其他端⼝也是可⽤的。
第⼀种 HttpURLConnection接⼝
Http通信中使⽤最多的是Get和Post.
Get请求可⽤获得静态页⾯,也可以把参数放在URL字串的后⾯,传递给服务器。
Post参数不是放在URL字串⾥⾯,⽽是放在http请求数据中。
URLConnection与HttpURLConnection都是抽象类,⽆法直接实例化对象。其对象主要通过URL的openConnection⽅法获得,但openConnection⽅法只是创建URLConnection或者HttpURLConnection
的实例,并不是进⾏真正的连接操作。因此在连接之前我们可⽤对⼀些属性进⾏设置
对HttpConnection实例的属性设置:
connection.setDoOutput(true);//设置输出流
connection.setDoInput(true);//设置输出流
connection.setRequestMethod("P OST");//设置⽅式为POST
connection.setUseCaches(false);//Post请求不能使⽤缓存
urlConn.disconnect();//连接完成之后关闭HttpURLConnection连接
⾸先在服务器上建⽴⼀个不需要传递参数的⽹页http1.jsp⽂件。代码如下:
<HTML>
<HEAD>
<TITLE>
Http Test
</TITLE>
</HEAD>
<BODY>
<% out.println("<h1>HTTP TEST<br>http test</h1>"); %>
</BODY>
</HTML>
再创建⼀个适⽤Get和Post来传递参数的⽹页httpget.jsp 代码如下:
<%@ page language="java" import = "java.util.*" pageEncoding = "gb2312" %>
<HTML>
<HEAD>
<TITLE>
Http Test
</TITLE>
</HEAD>
<BODY>
<%
String type = Parameter("par");
String result = new Bytes("iso-8859-1")),"gb2312");
out.println("<h1>parameters:"+result+"</h1>");
%>
</BODY>
</HTML>
以下例中通过Android程序分别以不同的⽅式访问这两个页⾯。
< ⽂件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=""
android rientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="通过下⾯的按钮进⾏不同⽅式的连接"/>
<Button
android:id="@+id/Button_HTTP"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="直接获取数据"/>
<Button
android:id="@+id/Button_Get"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="以GET⽅式传递数据"/>
<Button
android:id="@+id/Button_Post"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="以POST⽅式传递数据"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""
android rientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/TextView_HTTP"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
android最新版<Button
android:id="@+id/Button_Back"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="返回"/>
</LinearLayout>
public class Activity01 extends Activity{//进⼊界⾯实现3个控件的Activity public void onCreate(Bundle savedInstanceState){
setContentView(R.layout.main);
Button button_http = (Button) findViewById(R.id.Button_HTTP);
/* 监听button的事件信息 */
button_http.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
/* 新建⼀个Intent对象 */
Intent intent = new Intent();
/* 指定intent要启动的类 */
intent.setClass(Activity01.this, Activity02.class);
/* 启动⼀个新的Activity */
startActivity(intent);
/* 关闭当前的Activity */
Activity01.this.finish();
}
});
Button button_Get = (Button) findViewById(R.id.Button_Get);
/* 监听button的事件信息 */
button_Get.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
/* 新建⼀个Intent对象 */
Intent intent = new Intent();
/* 指定intent要启动的类 */
intent.setClass(Activity01.this, Activity03.class);
/
* 启动⼀个新的Activity */
startActivity(intent);
/* 关闭当前的Activity */
Activity01.this.finish();
}
});
Button button_Post = (Button) findViewById(R.id.Button_Post);
/* 监听button的事件信息 */
button_Post.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
/* 新建⼀个Intent对象 */
Intent intent = new Intent();
/* 指定intent要启动的类 */
intent.setClass(Activity01.this, Activity04.class);
/* 启动⼀个新的Activity */
startActivity(intent);
/* 关闭当前的Activity */
Activity01.this.finish();
}
});
}
}
public class Activity02 extends Activity{//直接获取数据
private final String DEBUG_TAG = "Activity02";
public void onCreate(Bundle savedInstanceState){
setContentView(R.layout.http);
TextView mTextView = (TextView)this.findViewById(R.id.TextView_HTTP); String httpUrl = "地址
String resultData = "";//获得的数据
URL url = null;
try{
url = new URL(httpUrl); //构造⼀个URL对象
}catch (MalformedURLException e){
Log.e(DEBUG_TAG, "MalformedURLException");
}
if (url != null){
try{
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();//使⽤HttpURLConnection打开连接 InputStreamReader in = new InputStream());//得到读取的内容(流)
BufferedReader buffer = new BufferedReader(in);// 为输出创建BufferedReader
String inputLine = null;
while (((inputLine = adLine()) != null)){//使⽤循环来读取获得的数据
resultData += inputLine + "\n";//我们在每⼀⾏后⾯加上⼀个"\n"来换⾏
}
in.close();//关闭InputStreamReader
urlConn.disconnect();//关闭http连接
if ( resultData != null ){
mTextView.setText(resultData);//设置显⽰取得的内容
}else {
mTextView.setText("读取的内容为NULL");
}
}catch (IOException e){
Log.e(DEBUG_TAG, "IOException");
}
}else{
Log.e(DEBUG_TAG, "Url NULL");
}
Button button_Back = (Button) findViewById(R.id.Button_Back);//设置按键事件监听
button_Back.setOnClickListener(new Button.OnClickListener(){//监听button的事件信息
public void onClick(View v){
Intent intent = new Intent();
intent.setClass(Activity02.this, Activity01.class);
startActivity(intent);
Activity02.this.finish();
}
});
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论