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方法获取网络图片,并且保存到本地
由于代码比较多,我就直接贴关键部分,文章最后附上项目压缩包文件:
代码篇:
1. 使用get方法获取网络html文件:
调用:
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原来的格式)
2. 使用post方法获取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的时候,也就是在发送数据方面有不同,其他的都是一样的。
3. 使用get方法获取网络图片:
如果运行过实例你就会发现,我们获取到的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,因为手机模拟器和自己本地的服务器都占用了这个换回地址