小白求教Android开发中HttpURLConnection的网络连接问题

木星没有木 2014-05-20 11:23:52
本人小白,正在学习android开发,但是在做一个连接功能的时候在模拟器和真机上都一直不能获得我的数据,郁闷死了
下面是我的代码

public String download(String urlstr)
{
StringBuffer sb = new StringBuffer();
String line = null;
BufferedReader buffer = null;
InputStream is = null;

try {

//创建一个URL对象
url = new URL(urlstr);
//创建一个HTTP连接
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();

is = urlConn.getInputStream();
buffer = new BufferedReader(new InputStreamReader(is));
while((line = buffer.readLine())!=null)
{
sb.append(line);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(buffer!=null)
buffer.close();
else if(is == null)
return "the connection is down";
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


每次到is = urlConn.getInputStream();这一步的时候就会爆出异常,然后每次都是is和buffer是null的,我传入的url是http://10.20.63.29:8080/mp3/resources.xml 这个,在我笔记本上用浏览器能看到里面内容,但是就是用android不能建立起http连接,又大神能提点一下么
...全文
1388 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxy2043 2015-03-18
  • 打赏
  • 举报
回复
3.0以上要在子线程中执行http操作,还要注意加入访问网络权限
qq11653786 2015-02-03
  • 打赏
  • 举报
回复
这个问题我也刚才碰到,找了1早上最后才发现,这都是android代码不规范引发的错误,你代码写的没错只要在asyncTask线程中运行就OK了. 在 android 3.0中,主线程的网络连接是不允许的。 StrictMode会自动打开。在 android 4.0也是一样的。 要修复这些问题,你必须在一个单独的线程中执行网络连接。例如,使用一个AsyncTask。
菜鸟刚入门 2014-05-30
  • 打赏
  • 举报
回复
貌似我昨天学习的时候也遇到了这样的问题,后面公司的大神用一个简单的线程就解决了这个问题
睡觉谁叫~~~ 2014-05-30
  • 打赏
  • 举报
回复
引用 2 楼 u012507918 的回复:
[quote=引用 1 楼 mm3forever 的回复:] 你可以试试用我这个function... get method 的。。

public static  String getTextContent( String urlpath,String encoding) throws Exception {
			 //可以看到,getTextContent接收到了目前还处于字符串形似的path,和编码。
			 //将字符串形式的path,转换成一个url
			 URL url = new URL(urlpath);
			 //得到url之后,将要开始连接网络,以为是连接网络的具体代码
			 //首先,实例化一个HTTP连接对象conn
			 HttpURLConnection conn = (HttpURLConnection)url.openConnection();
			 //定义请求方式为GET,其中GET的大小写不要搞错了。
			 conn.setRequestMethod("GET");
			 //定义请求时间,在ANDROID中最好是不好超过10秒。否则将被系统回收。
			 conn.setConnectTimeout(6*1000);
			 //请求成功之后,服务器会返回一个响应码。如果是GET方式请求,服务器返回的响应码是200,post请求服务器返回的响应码是206(貌似)。
			 if(conn.getResponseCode()== 200){
				 //返回码为真
				 //从服务器传递过来数据,是一个输入的动作。定义一个输入流,获取从服务器返回的数据
				 InputStream inStream = conn.getInputStream();
				 //得到输入流的数据之后,调用readStream方法对输入流进行处理。返回的一个字节数组。
				 //按ctrl进入readStream方法,看看readStream是怎么处理的
				 byte[] data = readStream(inStream);
				 //得到返回值。那么readStream主要做了些什么?readStream主要处理了将服务器返回的数据写到内存这个工作,也就是保存到了本地(我觉得)。
				 //以字符串形式的返回。String(data,encoding)是个知识点。
				return new String(data,encoding);
			 }	
			 return null;
		 }

	 /**
			 * 获取URL路径指定的网页代码·	
			 * @param urlpath URL路径
			 * @throws Exception
			 */
			 public static  InputStream getContent( String urlpath,String encoding) throws Exception {
				 URL url = new URL(urlpath);
				 //实例化一个HTTP连接对象conn
				 HttpURLConnection conn = (HttpURLConnection)url.openConnection();
				 //定义请求方式为GET,其中GET的格式需要注意
				 conn.setRequestMethod("GET");
				 //定义请求时间,在ANDROID中最好是不好超过10秒。否则将被系统回收。
				 conn.setConnectTimeout(6*1000);
				 if(conn.getResponseCode()== 200){
					return conn.getInputStream();
				 }	
				 return null;
			 }	
实现机制和我差不多,但是现在还是连接不起来,is是null,我怀疑会不会是url错了,所以连接建立失败,但是为什么浏览器中又可以打开呢.......[/quote]1.仔细检查下你传给服务器的参数是否正确,最好抓个网络包看看里面的内容 2.http请求放在线程中
哎,真难 2014-05-27
  • 打赏
  • 举报
回复
先确定是否读入xml,然后需要解析xml啊
Clare_0_0 2014-05-27
  • 打赏
  • 举报
回复
可以直接用HttpClient方法呀
木星没有木 2014-05-20
  • 打赏
  • 举报
回复
引用 1 楼 mm3forever 的回复:
你可以试试用我这个function... get method 的。。

public static  String getTextContent( String urlpath,String encoding) throws Exception {
			 //可以看到,getTextContent接收到了目前还处于字符串形似的path,和编码。
			 //将字符串形式的path,转换成一个url
			 URL url = new URL(urlpath);
			 //得到url之后,将要开始连接网络,以为是连接网络的具体代码
			 //首先,实例化一个HTTP连接对象conn
			 HttpURLConnection conn = (HttpURLConnection)url.openConnection();
			 //定义请求方式为GET,其中GET的大小写不要搞错了。
			 conn.setRequestMethod("GET");
			 //定义请求时间,在ANDROID中最好是不好超过10秒。否则将被系统回收。
			 conn.setConnectTimeout(6*1000);
			 //请求成功之后,服务器会返回一个响应码。如果是GET方式请求,服务器返回的响应码是200,post请求服务器返回的响应码是206(貌似)。
			 if(conn.getResponseCode()== 200){
				 //返回码为真
				 //从服务器传递过来数据,是一个输入的动作。定义一个输入流,获取从服务器返回的数据
				 InputStream inStream = conn.getInputStream();
				 //得到输入流的数据之后,调用readStream方法对输入流进行处理。返回的一个字节数组。
				 //按ctrl进入readStream方法,看看readStream是怎么处理的
				 byte[] data = readStream(inStream);
				 //得到返回值。那么readStream主要做了些什么?readStream主要处理了将服务器返回的数据写到内存这个工作,也就是保存到了本地(我觉得)。
				 //以字符串形式的返回。String(data,encoding)是个知识点。
				return new String(data,encoding);
			 }	
			 return null;
		 }

	 /**
			 * 获取URL路径指定的网页代码·	
			 * @param urlpath URL路径
			 * @throws Exception
			 */
			 public static  InputStream getContent( String urlpath,String encoding) throws Exception {
				 URL url = new URL(urlpath);
				 //实例化一个HTTP连接对象conn
				 HttpURLConnection conn = (HttpURLConnection)url.openConnection();
				 //定义请求方式为GET,其中GET的格式需要注意
				 conn.setRequestMethod("GET");
				 //定义请求时间,在ANDROID中最好是不好超过10秒。否则将被系统回收。
				 conn.setConnectTimeout(6*1000);
				 if(conn.getResponseCode()== 200){
					return conn.getInputStream();
				 }	
				 return null;
			 }	
实现机制和我差不多,但是现在还是连接不起来,is是null,我怀疑会不会是url错了,所以连接建立失败,但是为什么浏览器中又可以打开呢.......
mm3forever 2014-05-20
  • 打赏
  • 举报
回复
你可以试试用我这个function... get method 的。。

public static  String getTextContent( String urlpath,String encoding) throws Exception {
			 //可以看到,getTextContent接收到了目前还处于字符串形似的path,和编码。
			 //将字符串形式的path,转换成一个url
			 URL url = new URL(urlpath);
			 //得到url之后,将要开始连接网络,以为是连接网络的具体代码
			 //首先,实例化一个HTTP连接对象conn
			 HttpURLConnection conn = (HttpURLConnection)url.openConnection();
			 //定义请求方式为GET,其中GET的大小写不要搞错了。
			 conn.setRequestMethod("GET");
			 //定义请求时间,在ANDROID中最好是不好超过10秒。否则将被系统回收。
			 conn.setConnectTimeout(6*1000);
			 //请求成功之后,服务器会返回一个响应码。如果是GET方式请求,服务器返回的响应码是200,post请求服务器返回的响应码是206(貌似)。
			 if(conn.getResponseCode()== 200){
				 //返回码为真
				 //从服务器传递过来数据,是一个输入的动作。定义一个输入流,获取从服务器返回的数据
				 InputStream inStream = conn.getInputStream();
				 //得到输入流的数据之后,调用readStream方法对输入流进行处理。返回的一个字节数组。
				 //按ctrl进入readStream方法,看看readStream是怎么处理的
				 byte[] data = readStream(inStream);
				 //得到返回值。那么readStream主要做了些什么?readStream主要处理了将服务器返回的数据写到内存这个工作,也就是保存到了本地(我觉得)。
				 //以字符串形式的返回。String(data,encoding)是个知识点。
				return new String(data,encoding);
			 }	
			 return null;
		 }

	 /**
			 * 获取URL路径指定的网页代码·	
			 * @param urlpath URL路径
			 * @throws Exception
			 */
			 public static  InputStream getContent( String urlpath,String encoding) throws Exception {
				 URL url = new URL(urlpath);
				 //实例化一个HTTP连接对象conn
				 HttpURLConnection conn = (HttpURLConnection)url.openConnection();
				 //定义请求方式为GET,其中GET的格式需要注意
				 conn.setRequestMethod("GET");
				 //定义请求时间,在ANDROID中最好是不好超过10秒。否则将被系统回收。
				 conn.setConnectTimeout(6*1000);
				 if(conn.getResponseCode()== 200){
					return conn.getInputStream();
				 }	
				 return null;
			 }	
木星没有木 2014-05-20
  • 打赏
  • 举报
回复
引用 3 楼 BuleRiver 的回复:
1、需要调用connet方法,有些手机如果不调用connect方法,在getInputStream()时会异常 2、设置数据压缩方式为不要压缩,系统默认会使用gzip压缩,好像低版本的使用gzip压缩有bug,会接受数据不全。设置不要压缩的方式,请参考sdk文档
我后来调用了connect(),而且url调整为10.0.2.2,在AVD里面的浏览器可以看到要传进去的xml文件,但是应用里面还是读不进去
BuleRiver 2014-05-20
  • 打赏
  • 举报
回复
1、需要调用connet方法,有些手机如果不调用connect方法,在getInputStream()时会异常 2、设置数据压缩方式为不要压缩,系统默认会使用gzip压缩,好像低版本的使用gzip压缩有bug,会接受数据不全。设置不要压缩的方式,请参考sdk文档

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧