Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 594|回复: 0

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

[复制链接]

该用户从未签到

发表于 2011-10-24 09:21:15 | 显示全部楼层 |阅读模式
今天实现要实现的其实很简单,通过网络获取服务端一个文件(可以是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操作权限。
代码:
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连接对象,其次配置连接属性(是否可以读取,连接超时、读取超时),最后打开连接获取数据流保存到文件,还有网络连接权限
//缓存

        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取出来,打开如图:  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-10 19:34 , Processed in 0.342022 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表