`
啸笑天
  • 浏览: 3465652 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

Android与Internet(获取资源,多线程断点下载,get/post发送,发送xml)

阅读更多

从Internet获取数据

 

利用HttpURLConnection对象,我们可以从网络中获取网页数据.

URL url = new URL("http://www.sohu.com");

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

conn.setConnectTimeout(5* 1000);//设置连接超时

conn.setRequestMethod(“GET”);//以get方式发起请求

if (conn.getResponseCode() != 200) throw new RuntimeException("请求url失败");

InputStream is = conn.getInputStream();//得到网络返回的输入流

String result = readData(is, "GBK");

conn.disconnect();

//第一个参数为输入流,第二个参数为字符集编码

public static String readData(InputStream inSream, String charsetName) throws Exception{

ByteArrayOutputStream outStream = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int len = -1;

while( (len = inSream.read(buffer)) != -1 ){

outStream.write(buffer, 0, len);

}

byte[] data = outStream.toByteArray();

outStream.close();

inSream.close();

return new String(data, charsetName);

}


<!-- 访问internet权限 -->
<uses-permission android:name="android.permission.INTERNET"/>

利用HttpURLConnection对象,我们可以从网络中获取文件数据.
URL url = new URL("http://photocdn.sohu.com/20100125/Img269812337.jpg");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5* 1000);
conn.setRequestMethod("GET");
if (conn.getResponseCode() != 200) throw new RuntimeException("请求url失败");
InputStream is = conn.getInputStream();
readAsFile(is, "Img269812337.jpg"); 
public static void readAsFile(InputStream inSream, File file) throws Exception{
FileOutputStream outStream = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = -1;
while( (len = inSream.read(buffer)) != -1 ){
outStream.write(buffer, 0, len);
}
  outStream.close();
inSream.close();
}

多线程下载


 
使用多线程下载文件可以更快完成文件的下载,多线程下载文件之所以快,是因为其抢占的服务器资源多。如:假设服务器同时最多服务100个用户,在服务器中一条线程对应一个用户,100条线程在计算机中并非并发执行,而是由CPU划分时间片轮流执行,如果A应用使用了99条线程下载文件,那么相当于占用了99个用户的资源,假设一秒内CPU分配给每条线程的平均执行时间是10ms,A应用在服务器中一秒内就得到了990ms的执行时间,而其他应用在一秒内只有10ms的执行时间。就如同一个水龙头,每秒出水量相等的情况下,放990毫秒的水
肯定比放10毫秒的水要多。
多线程下载的实现过程:
1>首先得到下载文件的长度,然后设置本地文件
的长度。
HttpURLConnection.getContentLength();
RandomAccessFile file = new RandomAccessFile("QQWubiSetup.exe","rw");
file.setLength(filesize);//设置本地文件的长度
2>根据文件长度和线程数计算每条线程下载的数据长度和下载位置。如:文件的长度为6M,线程数为3,那么,每条线程下载的数据长度为2M,每条线程开始下载的位置如上图所示。
3>使用Http的Range头字段指定每条线程从文件的什么位置开始下载,如:指定从文件的2M位置开始下载文件,代码如下:
HttpURLConnection.setRequestProperty("Range", "bytes=2097152-");
4>保存文件,使用RandomAccessFile类指定每条线程从本地文件的什么位置开始写入数据。
RandomAccessFile threadfile = new RandomAccessFile("QQWubiSetup.exe ","rw");
threadfile.seek(2097152);//从文件的什么位置开始写入数据

向Internet发送请求参数
利用HttpURLConnection对象,我们可以向网络发送请求参数.
String requestUrl = "http://localhost:8080/itcast/contanctmanage.do";
Map<String, String> requestParams = new HashMap<String, String>();
requestParams.put("age", "12");
requestParams.put("name", "中国");
 StringBuilder params = new StringBuilder();
for(Map.Entry<String, String> entry : requestParams.entrySet()){
params.append(entry.getKey());
params.append("=");
params.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
params.append("&");
}
if (params.length() > 0) params.deleteCharAt(params.length() - 1);
byte[] data = params.toString().getBytes();
URL realUrl = new URL(requestUrl);
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
conn.setDoOutput(true);//发送POST请求必须设置允许输出
conn.setUseCaches(false);//不使用Cache
conn.setRequestMethod("POST");        
conn.setRequestProperty("Connection", "Keep-Alive");//维持长连接
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("Content-Length", String.valueOf(data.length));
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
outStream.write(data);
outStream.flush();
if( conn.getResponseCode() == 200 ){
        String result = readAsString(conn.getInputStream(), "UTF-8");
        outStream.close();
        System.out.println(result);
}
向Internet发送xml数据
利用HttpURLConnection对象,我们可以向网络发送请求参数.
String requestUrl = "http://localhost:8080/itcast/contanctmanage.do";
Map<String, String> requestParams = new HashMap<String, String>();
requestParams.put("age", "12");
requestParams.put("name", "中国");
 StringBuilder params = new StringBuilder();
for(Map.Entry<String, String> entry : requestParams.entrySet()){
params.append(entry.getKey());
params.append("=");
params.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
params.append("&");
}
if (params.length() > 0) params.deleteCharAt(params.length() - 1);
byte[] data = params.toString().getBytes();
URL realUrl = new URL(requestUrl);
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
conn.setDoOutput(true);//发送POST请求必须设置允许输出
conn.setUseCaches(false);//不使用Cache
conn.setRequestMethod("POST");        
conn.setRequestProperty("Connection", "Keep-Alive");//维持长连接
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("Content-Length", String.valueOf(data.length));
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
outStream.write(data);
outStream.flush();
if( conn.getResponseCode() == 200 ){
        String result = readAsString(conn.getInputStream(), "UTF-8");
        outStream.close();
        System.out.println(result);
}
向Internet发送xml数据
利用HttpURLConnection对象,我们可以向网络发送xml数据.
StringBuilder xml =  new StringBuilder();
xml.append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
xml.append("<M1 V=10000>");
xml.append("<U I=1 D=\"N73\">中国</U>");
xml.append("</M1>");
byte[] xmlbyte = xml.toString().getBytes("UTF-8");
URL url = new URL("http://localhost:8080/itcast/contanctmanage.do?method=readxml");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5* 1000);
conn.setDoOutput(true);//允许输出
conn.setUseCaches(false);//不使用Cache
conn.setRequestMethod("POST");        
conn.setRequestProperty("Connection", "Keep-Alive");//维持长连接
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("Content-Length", String.valueOf(xmlbyte.length));
conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");
DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
outStream.write(xmlbyte);//发送xml数据
outStream.flush();
if (conn.getResponseCode() != 200) throw new RuntimeException("请求url失败");
InputStream is = conn.getInputStream();//获取返回数据
String result = readAsString(is, "UTF-8");
outStream.close();



  • 大小: 11.3 KB
  • web.rar (2.4 MB)
  • 下载次数: 139
分享到:
评论
1 楼 yiersanxuexi 2013-04-01  
LZ,请教下,你这样的频繁操作数据库,下载速度应该很受限制吧?

相关推荐

    android从web服务器文件下载,进度条显示,下载完成后点击安装

    - 使用OkHttp创建一个网络请求,设置URL为要下载的文件地址,通过GET或POST方法获取文件。 - 添加回调监听器来处理响应,包括成功、失败和进度更新。 2. **下载进度条显示**: - 在Android中,通常在主线程更新...

    基于Android的HTTP下载器程序

    通过建立与服务器的连接,发送GET或POST请求,获取响应,并读取返回的数据。在HTTP下载器中,我们主要使用`setRequestProperty()`设置请求头,如"Accept-Encoding" (接受编码) 和 "User-Agent" (用户代理),然后调用...

    android 网络下载

    本文将深入探讨如何实现一个完整的Android多线程下载功能,以提高下载效率并确保安全性。 首先,我们需要了解Android的网络编程基础。Android系统支持多种网络API,包括HttpURLConnection和HttpClient。在现代的...

    android http下载

    在Android平台上,HTTP下载是一项常见的任务,特别是在...在实际应用中,你可能还需要考虑进度显示、错误处理、网络状态检查、多线程下载等复杂情况。希望以上内容能为你在Android平台上实现HTTP XML文件下载提供帮助。

    C# 写的小小下载器 文件断点—续传

    4. **多线程与异步编程**:为了提高下载效率,我们可以使用多线程或者异步编程来并行下载文件的不同部分。C#的`Task`和`async/await`关键字可以帮助我们编写简洁的异步代码,提升用户体验。 5. **状态保存**:在...

    黎活明android教程的全程PPT

    2&gt; 网络--通过HTTP协议实现多线程断点续传下载 3&gt; 为应用添加新的Activity与参数传递 4&gt; 意图 第六天 1&gt; Activity的生命周期 2&gt; 广播接收者(实现短信监听) 3&gt; 服务与语音刻录(实现电话监听)、使用AIDL实现进程...

    安卓Android源码——如何远程下载安装的.zip

    1. **多线程下载**:为了提高下载速度,通常会采用多线程分块下载。 2. **断点续传**:如果下载中断,应用应能记住已下载的部分,从断点处继续下载。 3. **进度反馈**:用户界面应显示下载进度,提供取消、暂停和...

    Android网络编程 王家林

    - 下载服务:创建一个后台下载服务,处理断点续传、多线程下载等问题。 - 即时通讯应用:模拟一个简单的即时通讯应用,实现文本聊天功能,涉及网络编程和数据解析。 通过阅读《Android.4.0网络编程详解》,开发者...

    传智播客Android视频教程-课程源码.rar

    2&gt; 网络--通过HTTP协议实现多线程断点续传下载 3&gt; 为应用添加新的Activity与参数传递 4&gt; 意图 第六天 1&gt; Activity的生命周期 2&gt; 广播接收者(实现短信监听) 3&gt; 服务与语音刻录(实现电话监听)、使用AIDL实现进程通信...

    android DownloadApk

    这些库可以帮助我们发送GET或POST请求到服务器,获取apk文件的下载链接。一旦获取到链接,我们可以在Android的异步任务(AsyncTask)或者使用Handler/Looper机制来避免阻塞主线程。 下载过程可以分为以下几个步骤:...

    Android 文件下载

    总的来说,Android文件下载涉及网络编程、文件操作和多线程知识,理解并熟练运用HttpURLConnection、OkHttp以及DownloadManager,能让你在Android开发中更加得心应手。通过不断地实践和学习,你将能构建出稳定、高效...

    Python-可以断点续爬的豆瓣单线程图书爬虫

    通过它,我们可以向豆瓣API发送GET或POST请求,获取图书信息。 3. **BeautifulSoup库** BeautifulSoup库是解析HTML和XML文档的强大工具,它允许我们通过CSS选择器或XPath表达式来定位页面元素,提取所需数据。 4....

    Android第十一章使用网络技术

    - 在AndroidManifest.xml中声明INTERNET权限:&lt;uses-permission android:name="android.permission.INTERNET" /&gt; - 自Android 6.0起,运行时权限管理也需要用户在运行时授予INTERNET权限。 3. 异步网络请求: - ...

    android weather

    通过"android weather"项目,初学者不仅可以掌握Android应用开发的基本技能,还能了解到数据获取、网络请求、UI设计等多个重要方面,为今后的Android开发打下坚实基础。在实际开发中,还可以考虑引入天气动画、多...

Global site tag (gtag.js) - Google Analytics