您的位置:首页 > 理论基础 > 计算机网络

Android---网络交互之客户端请求服务端资源

2010-12-01 16:23 477 查看
最近那个茫然啊,工作不如意,感情不如意,感觉事事不顺,在android上又荒废了些时日。最近因为想做一个APK,主要涉及到网络方面的应用,所以也开始学习之前没怎么涉及到的模块。

今天实现要实现的其实很简单,通过网络获取服务端一个文件(可以是txt、png、mp3等等),因为之前是做c#开发的,所以操起老本行,模拟一个服务器,通过url去获取服务器的一个资源,就这么简单,所以大家千万千万不要被吓着,没有什么post请求、没有什么get请求,也就是说没有验证直接获取,所有这些post、get通通不涉及。
Android中实现网络连接提供了三种接口以供我们使用:
1、标准java.net.*接口
2、org.Apache.*接口
3、android.net.*接口
我的示例就是使用第一种接口来实现,来实现从服务器下载一个txt文档,我们要实现这个功能要通过几个步骤实现
1、在sdcard中创建一个文件,将网络流保存为txt的最终文本文件
2、实现网络连接,获取网络流,保存到sdcard中的txt文件中
3、新建线程下载服务器txt文档
4、模拟一个web服务器(C#)
第一步工作实现过程:首先验证sdcard状态(是否载入并且是否可以读写),其次获得(新建)文件目录和新建txt文件,最后初始化一个FileOutputStream对象,他就是实现从数据流到文件的关键纽带,还有sdcard操作权限。
参考:http://tdq222.javaeye.com/blog/701962
代码:



代码

File dir
=
null
;

File file
=
null
;

if
(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

Log.v(
"
tag
"
,
"
---------create file
"
);

//
获得sdcard目录

dir
=
Environment.getExternalStorageDirectory();

//
在指定目录新建文件

file
=
new
File(dir,
"
test.txt
"
);

}

FileOutputStream fos
=
null
;

try
{

fos
=
new
FileOutputStream(file);

}
catch
(FileNotFoundException e1) {

//
TODO Auto-generated catch block

e1.printStackTrace();

}




代码

<!--
在SDCard中创建与删除文件权限
-->

<
uses-permission
android:name
="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
/>

<!--
往SDCard写入数据权限
-->

<
uses-permission
android:name
="android.permission.WRITE_EXTERNAL_STORAGE"
/>


第二步工作内容实现过程:首先创建Url连接对象,其次配置连接属性(是否可以读取,连接超时、读取超时),最后打开连接获取数据流保存到文件,还有网络连接权限。参考:http://java-cofi.javaeye.com/blog/734185
代码:



代码

//
缓存

byte
[] bf
=
new

byte
[
8192
];

int
current
=
0
;

try
{

//
创建一个URL对象

URL url
=
new
URL(spec);
//
spec:资源连接地址

HttpURLConnection connect
=
(HttpURLConnection)url.openConnection();

//
从服务端下载Http资源,设置读取权限

connect.setDoInput(
true
);

//

//
上传资源到服务端,设置写入权限

//
connect.setDoOutput(true);

//
设置连接服务器超时时间

connect.setConnectTimeout(
5
*
1000
);

//
设置从服务器读取数据超时时间

connect.setReadTimeout(
30
*
1000
);

//
获得网络连接状态码

int
code
=
connect.getResponseCode();

//
判断是否连接成功(HttpURLConnection.HTTP_OK==200,0-200都属正常)

if
(code
==
HttpURLConnection.HTTP_OK){

//

//
打开连接获取资源(不写也没关系,调用getInputStream()默认会打开连接

//
connect.connect();

InputStream is
=
connect.getInputStream();

BufferedInputStream bis
=
new
BufferedInputStream(is);

while
((current
=
bis.read(bf))
!=-
1
){

fos.write(bf,
0
, current);

}

bis.close();

fos.close();

//
断开连接

connect.disconnect();

}

}
catch
(MalformedURLException e) {

//
TODO Auto-generated catch block

e.printStackTrace();

}
catch
(IOException e) {

//
TODO Auto-generated catch block

e.printStackTrace();

}




代码

<!--
在SDCard中创建与删除文件权限
-->

<
uses-permission
android:name
="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
/>

<!--
往SDCard写入数据权限
-->

<
uses-permission
android:name
="android.permission.WRITE_EXTERNAL_STORAGE"
/>


第三步主要是为了不使下载资源时造成主UI堵塞



代码

private
Handler handler
=
new
Handler(){

public

void
handleMessage(Message msg){

//
提示用户下载完成

if
(msg.what
==
1
){

Toast.makeText(Main.
this
,
"
down succes
"
, Toast.LENGTH_SHORT).show();

}
else
{

Toast.makeText(Main.
this
,
"
down fail
"
, Toast.LENGTH_SHORT).show();

}

super
.handleMessage(msg);

}

};

@Override

public

void
onClick(View v) {

//
TODO Auto-generated method stub

Log.v(
"
tag
"
,
"
------------onclick
"
);

//
开启下载线程

Thread thread
=
new
Thread(
new
downThread());

thread.start();

}

class
downThread
implements
Runnable{

@Override

public

void
run() {

//
TODO Auto-generated method stub

//
下载资源

download();

Message msg
=
new
Message();

msg.what
=
1
;

handler.sendMessage(msg);

}

}


第四步就简单了,新建一个网站提供一个链接就ok了例如:http://localhost:7643/WebSite1/data/test.txt
,但是有一点要注意,将
localhost换成10.0.2.2,这就是本机的意思吧(未确认),至此从服务器获取资源就实现了,打开DDMS中sdcard,把test.txt取出来,打开如图:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐