Android中要与远程服务器通信有很多方法,今天我们来介绍使用http协议从远程服务器上获取数据。
在android中可以使用 一下三种接口和服务器进行http通信:
1. java标准接口:java.net.*;
2. apathe接口: org. apache. http. *;
3. android接口: android.net.*;
今天我们介绍 java的标准接口,接下来我们将介绍:
1. 使用get方法获取网络html文件
2. 使用post方法获取网络html文件
3. 使用get方法获取网络图片,并且保存到本地
由于代码比较多,我就直接贴关键部分,文章最后附上项目压缩包文件:
代码篇:
调用:
btn_get.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getToOpenUrl("http://" + DOMIN + ":" + PORT + "/Web1/login2.jsp?par1=10086&par2=199"); } });方法:
// 使用get方法获取数据 private void getToOpenUrl(String urladdr) { try { String resultData = ""; URL url = new URL(urladdr); if (url != null) { HttpURLConnection connection = (HttpURLConnection) url .openConnection(); connection.setConnectTimeout(1000 * 5); InputStreamReader in = new InputStreamReader( connection.getInputStream()); BufferedReader buffer = new BufferedReader(in); String inputLine = null; while ((inputLine = buffer.readLine()) != null) { resultData += inputLine + "\n"; } in.close(); buffer.close(); connection.disconnect(); mtv.setText(resultData != "" ? resultData : "读取内容为null"); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }使用 步骤:
(1)初始化一个URL对象, 参数是要访问的服务器地址。 DOMIN 和 PORT 定义的是两个静态变量(如下),拼接之后: "http://192.168.1.19:8080/Web1/login2.jsp?par1=10086?par2=199",如果学习过jsp的应该知道这里会传两个参数过去,然后服务器jsp文件可以处理(这里就不做介绍了)
private static final String DOMIN = "192.168.1.19";
private static final String PORT = "8080";
(2)调用 url.openConnection() 获得一个HttpURLConnection对象,这个就是我们和服务器之间的链接。
(3)然后可以通过 conn.getInputStream() 得到服务器的返回流(我们请求的html文件)
(4)解析流数据(这里我们直接用resultData字符串将获取的html保持下来,最后答应在 textView中。这里我们使用bufferreader是为了能一行一行的读html文件,保持html原来的格式)
调用:
btn_post.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { postToOpenUrl("http://" + DOMIN + ":" + PORT + "/Web1/login3.jsp"); } });
// 使用post方法请求数据 private void postToOpenUrl(String urladdr) { String resultData = ""; try { URL url = new URL(urladdr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setUseCaches(true); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.connect(); DataOutputStream out = new DataOutputStream(conn.getOutputStream()); String content = "par=" + URLEncoder.encode("abcdefg", "gb2312"); out.writeBytes(content); out.flush(); out.close(); BufferedReader buffer = new BufferedReader(new InputStreamReader( conn.getInputStream())); String inputLine = null; while ((inputLine = buffer.readLine()) != null) { resultData += inputLine + "\n"; } buffer.close(); conn.disconnect(); mtv.setText(resultData != null ? resultData : "获取数据为null"); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }这里需要注意,使用post发送请求的时候,请求的参数字段不是直接拼接在地址后面的,应该将参数写在请求流中。而且post方法更安全,可以设置更多的参数,可传输数据量也比get大,关于post和get的区别请大家参看其它资料。
使用步骤:
(1)初始化URL对象
(2)调用 url.openConnection() 获取HttpURLConnection对象
(3)设置可输入输出: conn.setDoInput(true); conn.setDoOutput(true)
(4)设置请求方式为 post : conn.setRequestMethod("POST");
(5)设置字符编码格式 Content-Type: conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
(6)然后调用 conn.connect() ; 链接服务器,打开通道
(7)然后初始化参数,并使用 writeBytes(content); 想服务器发送请求。这里就是将参数设置到流中发送到服务器,参数相当于: ?par=abcdefg
DataOutputStream out = new DataOutputStream(conn.getOutputStream()); String content = "par=" + URLEncoder.encode("abcdefg", "gb2312"); out.writeBytes(content); out.flush(); out.close();(8)发送请求后就是接收服务器返回数据,和前面的get获得服务器数据是一样的。
大家会发现,在使用get和post的时候,也就是在发送数据方面有不同,其他的都是一样的。
如果运行过实例你就会发现,我们获取到的html其实是文本文件,就和txt是一样的,那么如果我们要获取服务器上的图片,图片的存储格式稍有不同的就是二进制存储,但是对于我们来说都是流,所以在处理的时候,我们只需要将输入流转化为BitMap就可以获得图片了。
调用:
btn_getPicture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bitmap picture = getNetBitMap("http://" + DOMIN + ":" + PORT + "/Web1/img.jpg"); if (null != picture) { img_picture.setImageBitmap(picture); SaveJpgBitmapToLocal(picture, "/sdcard/", String.format( "portrait_%d" + ".jpg", System.currentTimeMillis())); } else { showToast("获取网络图片失败"); } } });
方法:
// 获取网络图片 private Bitmap getNetBitMap(String mapurl) { Bitmap netPicture = null; HttpURLConnection conn; InputStream is; try { URL url = new URL(mapurl); conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); is = conn.getInputStream(); netPicture = BitmapFactory.decodeStream(is); is.close(); conn.disconnect(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return netPicture; }我们可以看到,处理方法和get完全一样,只是在得到输入流is后,我们直接将其转化为了 BitMap而已。
调用部分还有一个方法是将获取到的图片save到本地:
// 保存jpg图片到本地 private void SaveJpgBitmapToLocal(Bitmap bitmap, String path, String filename) { File file = new File(path, filename); OutputStream os; try { os = new FileOutputStream(file); bitmap.compress(CompressFormat.JPEG, 100, os); os.flush(); os.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
好了,实例讲解完毕,这里加几点注意事项:
如果你运行实例获取不成功,可能是一下几个原因造成的:
1. 看服务器启动木有
2. 服务器地址,端口号
3. 服务器下文件目录是否正确
4. 192.168.1.19 是本机在局域网的地址,这里不要使用 127.0.0.1,因为手机模拟器和自己本地的服务器都占用了这个换回地址
运行效果图:
下载源码地址:
http://download.csdn.net/detail/u013647382/8266051