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包:
- Android系统回顾(八):网络通信(二)
- Android系统回顾(八):网络通信(一)
- Android系统回顾(八):网络通信(三)Android与.net服务器通过Socket通信
- Android系统回顾(二):Android基础知识
- Android回顾(二)
- Linux网络通信(二)
- Socket网络通信(二)
- Android的通信机制与网络(二)
- Android网络通信Volley框架源码浅析(二)
- Android的通信机制与网络(二)
- Android 数据加密及安全网络通信杂谈(二)
- [置顶] Android网络通信Volley框架源码浅析(二)
- Android系统回顾(一):Android基础知识
- Python 基础回顾(八)
- Qt网络(八)TCP(二)
- 网络(八)TCP(二)
- Android系统回顾(六):Activity详解
- Android系统回顾(六):菜单
- IO模拟I2C
- 汉诺塔 经典递归算法 in python
- C++ split 字符串分割实现
- OpenGL--3D世界(视图变换,模型变换,投影变换,视口变换)
- Linux查看文件系统大小或者文件夹大小
- Android系统回顾(八):网络通信(二)
- 【Tracking】【论文阅读随记一】-iccv11-Superpixel Tracking
- spring3 mvc中POST和GET乱码的解决
- app图片
- 完美解决.net2.0和.net4.0在同一个iis中共同运行
- DS18B20温度格式转换
- launcher之workspace
- Linux 通用Makefile模板
- Object-C 类,对象,运行时,isa