Android系统回顾(八):网络通信(二)

来源:互联网 发布:excel中一行数据求和 编辑:程序博客网 时间:2024/04/28 05:36

本文源码参见:https://github.com/YongYuIT/MeiNvLiuLanQi


三、基于Ftp协议的下载方式

1、在IIS上建立FTP站点,并可以用浏览器浏览下载其中的文件(详见《windows 7上创建ftp站点》一文)

2、用Android客户端下载这个文件

本文的实例是基于《Android系统回顾(八):网络通信(一)》中的项目添加而来的。

实现的效果是,在GridView的列表项上(任意一个列表项)点击之后立即启动ftp下载线程下载上图ftp服务器中的apk文件,待文件下载完成之后自动安装。

/MeiNvLiuLanQi/src/com/example/meinvliulanqi/basic_service/IGetFtpData.java文件:

package com.example.meinvliulanqi.basic_service;

public interface IGetFtpData
{
    public void onGetFtpData(String info);
}

/MeiNvLiuLanQi/src/com/example/meinvliulanqi/basic_service/Task_get_ftp_file.java文件:

package com.example.meinvliulanqi.basic_service;


import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
//这些类需要外部jar包:commons-net-3.1.jar
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPReply;
import android.os.AsyncTask;
import android.util.Log;
public class Task_get_ftp_file extends AsyncTask<String, Integer, String>
{
    private IGetFtpData igetdata;
    public Task_get_ftp_file(IGetFtpData iget)
    {
        igetdata = iget;
    }
    @Override
    protected String doInBackground(String... arg0)
    {
        try
        {
            // 获取请求头,应该是ftp
            String reqTitle = arg0[0].substring(0, 3);
            // 获取请求地址就是ftp://后面的内容
            String reqBody = arg0[0].substring(6);
            // 获取请求的主机地址
            String host = reqBody.split("/")[0];
            // 获取文件在服务器下的路径
            String webFilePath = reqBody.substring(reqBody.indexOf("/"),
                    reqBody.length());
            // 获取文件名
            String fileName = reqBody.substring(reqBody.lastIndexOf("/"),
                    reqBody.length());
            // 建立ftp客户端
            FTPClient ftpClient = new FTPClient();
            ftpClient.setControlEncoding("UTF-8");
            // 定义服务器响应值
            int reply;
            // 连接至服务器
            ftpClient.connect(host);
            // 获取响应值
            reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply))
            {
                // 断开连接
                ftpClient.disconnect();
                Log.e("thinking-------", "服务器连接失败");
                return null;
            }
            // 登录到服务器
            ftpClient.login("ftp_test", "19911214");
            // 获取响应值
            reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply))
            {
                // 断开连接
                Log.e("thinking-------", "服务器连接失败");
                return null;
            } else
            {
                String replyStr = ftpClient.getReplyString();
                Log.i("thinking-------", replyStr);
                // 获取登录信息
                FTPClientConfig config = new FTPClientConfig(ftpClient
                        .getSystemType().split(" ")[0]);
                config.setServerLanguageCode("zh");
                ftpClient.configure(config);
                // 使用被动模式设为默认
                ftpClient.enterLocalPassiveMode();
                // 二进制文件支持
                ftpClient
                        .setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);
            }
            InputStream inputStream = ftpClient.retrieveFileStream(webFilePath);
            String filePathStr = "/sdcard/meinvliulanqi";
            File filePath = new File(filePathStr);
            if (!filePath.exists())
            {
                filePath.mkdirs();
            }
            File newApkFile = new File(filePathStr, fileName);
            if (!newApkFile.exists())
            {
                newApkFile.createNewFile();
                return filePath + "/" + fileName;
            }
            FileOutputStream fout = new FileOutputStream(newApkFile);
            byte[] buffer = new byte[1024 * 10];
            while (true)
            {
                int len = inputStream.read(buffer);
                if (len == -1)
                {
                    break;
                }
                fout.write(buffer, 0, len);
            }
            inputStream.close();
            fout.close();
            ftpClient.logout();
            ftpClient.disconnect();
            return filePath + "/" + fileName;
        } catch (Exception e0)
        {
            Log.e("thinking-------", "服务器连接失败");
            return null;
        }
    }
    @Override
    protected void onProgressUpdate(Integer... values)
    {
    }
    @Override
    protected void onPostExecute(String result)
    {
        this.igetdata.onGetFtpData(result);
    }
}

/MeiNvLiuLanQi/src/com/example/meinvliulanqi/ui/MainActivity.java文件:

package com.example.meinvliulanqi.ui;
import java.io.File;
import org.json.JSONArray;
import org.json.JSONException;
import com.example.meinvliulanqi.basic_service.IGetFtpData;
import com.example.meinvliulanqi.basic_service.IGetdata;
import com.example.meinvliulanqi.basic_service.Task_get_ftp_file;
import com.example.meinvliulanqi.basic_service.Task_getdata;
import com.example.meinvliulanqi.basic_service.Task_getimgs;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.Toast;
public class MainActivity extends Activity implements IGetdata, IGetFtpData
{
    private MeinvBaseAdapter ada;
    private GridView         gid_meinv;
    private JSONArray        meinvs;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Task_getdata task = new Task_getdata(this);
        task.execute(new String[] { "http://192.168.10.111:8011/MeinvInfo.ashx?method=get_meinv&&check_num=1001" });
    }
    @Override
    public void onGetInfoData(String info)
    {
        try
        {
            meinvs = new JSONArray(info);
            initUIInfo();
        } catch (JSONException e)
        {
            Log.e("thinking-------", e.getMessage());
        }
    }
    private void initUIInfo()
    {
        gid_meinv = (GridView) findViewById(R.id.gid_meinv);
        ada = new MeinvBaseAdapter(meinvs, new Bitmap[meinvs.length()], this);
        gid_meinv.setAdapter(ada);
        String[][] img_infos = new String[meinvs.length()][2];
        for (int i = 0; i < img_infos.length; i++)
        {
            try
            {
                img_infos[i][0] = meinvs.getJSONObject(i)
                        .getString("photoPath");
            } catch (JSONException e)
            {
                img_infos[i][0] = "";
                Log.e("thinking-------", e.getMessage());
            }
            img_infos[i][1] = i + "";
        }
        Task_getimgs task = new Task_getimgs(this);
        task.execute(img_infos);
        gid_meinv.setOnItemClickListener(new OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3)
            {
                Task_get_ftp_file task = new Task_get_ftp_file(
                        MainActivity.this);
                task.execute(new String[] { "ftp://192.168.10.111/MeiNv_Liulanqi.apk" });
            }
        });

    }


    @Override
    public void onGetImgData(Bitmap[] img)
    {
        ada.setImgs(img);
    }


    @Override
    public void onGetFtpData(String info)
    {
        Toast t = Toast.makeText(this, info, 10000);
        t.show();
        Intent install = new Intent(Intent.ACTION_VIEW);
        install.setDataAndType(Uri.fromFile(new File(info)),
                "application/vnd.android.package-archive");
        this.startActivityForResult(install, 1111);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if (requestCode == 1111)
        {
            Toast t = Toast.makeText(this, "安装完毕", 10000);
            t.show();
        }
    }

}

特别注意:下载ftp数据需要外部jar包的支持——commons-net-3.1.jar

添加jar包步骤如下:

a、将jar包放置在/MeiNvLiuLanQi/libs/commons-net-3.1.jar路径下

b、添加外部jar包:



0 0