1.首先,来介绍一下HttpURLConnection类,HttpURLConnection类位于java.net包中,用于发送HTTP请求和获取HTTP响应。由于此类是抽象类,不能直接实例化对象,所以需要使用URL的openConnection()方法来获得。
例如,要创建一个http://www.baidu.com 网站对应的HttpURLConnection对象,可以使用下列代码:
URL url=new URL("http://www.baidu.com");
HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();
注:上述代码通过openConnection()方法创建的HttpURLConnection对象,并没有真正执行连接操作,只是创建了一个新的实例,在进行连接前,还可以设置一些属性。
例如,连接超时的时间和请求方式等,代码如下:
urlConnection.setConnectTimeout(5000);//设置连接超时时间为5秒
urlConnection.setRequestMethod("GET");//设置连接的方式为get方式
创建了HttpURLConnection对象后,就可以使用该对象发送HTTP请求了。
2.在编写我们的Android项目之前,先做下面几个步骤:
(1).开启Tomcat服务器,如下图所示:
(2).把我们所需要的Web项目部署到Tomcat服务器上,也可以将我们Web项目复制到tomcat服务器的安装目录下的webapps目录底下,即可,如下图所示:
(3).这个Android项目要访问的为music项目,打开此项目,如下图所示:
其中我们Android要访问的为image文件夹下的一张图片,和music项目底下的index.jsp文件,即查看此网络图片和网络源码。
(4).最后,我们必须要知道当前网络的IP地址,因为我们访问的为Windows系统下的tomcat服务器的Web项目,而Android系统的内核为Linux,系统不一样,所以我们在windows系统下访问Web'项目,可以直接输入http://localhost:8083/music/index.jsp 或者http://127.0.0.1:8083/music/index.jsp 以及http://192.168.91.1:8083/music/index.jsp ,而Android访问Web项目只可以通过http://192.168.91.1:8083/music/index.jsp 所以,先查看我们的IP地址,打开命令行窗口,输入ipconfig命令,即可查看,如下图所示:
其中查看到的IPv4地址即为IP地址。
3.接下来就可以编写我们的Android项目了,此Android项目用来查看网络图片和网络源码,新建Android项目,项目名为android_net,主要项目结构如下:
(1).首先,打开我们的activity_main.xml布局文件,此布局文件只放置两个按钮,点击不同的按钮跳转到不同的Activity,代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/net_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查看网络图片" />
<Button
android:id="@+id/net_code"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查看网络源码" />
</LinearLayout>
(2).打开MainActivity.java文件,此类用来点击按钮跳转不同的Activity,代码如下:
package com.android.android_net;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button net_image,net_code;//声明Button对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* 获取布局管理器中的两个Button控件 */
net_image=(Button)findViewById(R.id.net_image);
net_code=(Button)findViewById(R.id.net_code);
/* 分别添加按钮点击监听事件 */
net_image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,ShowNetImageActivity.class);//实例化Intent对象
startActivity(intent);//开启此Activity,跳转到ShowNetImageActivity类
}
});
net_code.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,ShowNetCodeActivity.class);//实例化Intent对象
startActivity(intent);//开启此Activity,跳转到ShowNetCodeActivity类
}
});
}
}
(3).接下来在layout目录下新建一个activity_image.xml文件,用来显示网络的图片,主要代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="网络图片路径"
android:padding="5dp"/>
<EditText
android:id="@+id/imagePath_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="http://192.168.91.1:8083/music/image/mm4.jpg"/>
<Button
android:id="@+id/show_netimage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查看网络图片"/>
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"/>
</LinearLayout>
(4).接着,在com.android.android_net包下新建一个ShowNetImageActivity类,其中开启了一个新线程来调用ImageService的getImage()方法,这样才能避免网络主线程异常,代码如下:
package com.android.android_net;
import com.android.service.ImageService;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
public class ShowNetImageActivity extends Activity {
private EditText imagePath_et;//声明EditText对象,即图片路径输入框
private Button show_netimage;//声明Button对象
private ImageView imageView;//声明ImageView对象
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image);
/* 获取布局管理器的各个控件 */
imagePath_et=(EditText)findViewById(R.id.imagePath_et);
show_netimage=(Button)findViewById(R.id.show_netimage);
imageView=(ImageView)findViewById(R.id.imageView);
//为按钮点击添加事件监听器
show_netimage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
final String imagePath=imagePath_et.getText().toString();//获取图片路径
//新建一个线程
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
try {
byte[] data=ImageService.getImage(imagePath);//调用ImageService类的getImage()方法,返回字节数组
final Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);//创建一个Bitmap对象
imageView.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
imageView.setImageBitmap(bitmap);//设置显示的图片
}
});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();//开启线程
}
});
}
}
(5).接着,主要的一个ImageService类,在com.android.service包下,用来返回网络图片的数据,代码如下:
package com.android.service;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class ImageService {
public static byte[] getImage(String imagePath) throws Exception {
// TODO Auto-generated method stub
URL url=new URL(imagePath);//实例化URL对象url
HttpURLConnection connection=(HttpURLConnection) url.openConnection();//实例化HttpURLConnection对象connection
connection.setConnectTimeout(5000);//设置连接超时时间为5秒
connection.setRequestMethod("GET");//设置请求方法为get方式
int code=connection.getResponseCode();//获取状态码
//如果状态码请求成功的话,即code等于HttpURLConnection.HTTP_OK,也可以写成code==200
if(code==HttpURLConnection.HTTP_OK){
InputStream inputStream=connection.getInputStream();//获得输入流,返回一个InputStream对象
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();//实例化一个字节数组输出输入流对象
byte[] buffer=new byte[1024];//实例化一个字节数组对象
int len=0;//定义一个变量,初始值为0
//当获取到的输入流有数据时,循环写入数据
while((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer, 0, len);//写入数据
}
inputStream.close();//关闭输入流
return outputStream.toByteArray();//返回数据字节数组
}
return null;
}
}
(6).接着在layout目录下新建一个activity_code.xml文件,用来显示网络源码,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="网络图片路径:" />
<EditText
android:id="@+id/codePath_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="http://192.168.91.1:8083/music/index.jsp" />
<Button
android:id="@+id/show_netcode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查看网络源码" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="哈哈..." />
</ScrollView>
</LinearLayout>
(7).在com.android.android_net包下新建一个ShowNetCodeActivity类,其中开启了一个新线程,使用Handler消息机制来显示我们的网络源码,其中新建线程中调用了CodeService类的getCode()方法,来获取网络源码,ShowNetCodeActivity类代码如下:
package com.android.android_net;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.android.service.CodeService;
public class ShowNetCodeActivity extends Activity {
private EditText codePath_et;//声明EditText对象
private Button show_netcode;//声明Button对象
private TextView textView;//声明textView对象
private String result="";//初始化一个空的String类型变量
private Handler handler;//声明一个Handler对象
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_code);
/* 获取布局管理器中的各个控件 */
codePath_et=(EditText)findViewById(R.id.codePath_et);
show_netcode=(Button)findViewById(R.id.show_netcode);
textView=(TextView)findViewById(R.id.textView);
//为按钮点击添加监听事件
show_netcode.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final String codePath=codePath_et.getText().toString();//获取网络源码的路径
//新建一个线程
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
result=CodeService.getCode(codePath);//调用CodeSErvice类的getCode方法,返回字符串数据
Message msg=handler.obtainMessage();//通过handler对象获得Message消息
handler.sendMessage(msg);//发送消息
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();//开启一个线程
//实例化一个Handler对象
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
if(result!=null){
textView.setText(result);//设置文本视图显示的文本
}
super.handleMessage(msg);
}
};
}
});
}
}
(8).下面,在com.android.service包下新建一个CodeService类,用来获取网络源码,代码如下:
package com.android.service;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class CodeService {
public static String getCode(String codePath) throws Exception {
// TODO Auto-generated method stub
URL url=new URL(codePath);//实例化一个URL对象
HttpURLConnection connection=(HttpURLConnection) url.openConnection();//实例化一个HttpURLConnection对象
connection.setConnectTimeout(5000);//设置连接超时时间为5秒
connection.setRequestMethod("GET");//设置连接的方式为get方式
int code=connection.getResponseCode();//获取状态码
//如果请求成功的话
if(code==200){
InputStream inputStream=connection.getInputStream();//获取输入流,返回InputStream对象
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();//实例化一个ByteArrayOutputStream对象
byte[] buffer=new byte[1024];//实例化一个字节数组对象
int len=0;//定义一个变量,初始值为0
//当获取到的输入流有数据时,循环写入数据
while((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer, 0, len);//写入数据
}
inputStream.close();//关闭输入流
byte[] data=outputStream.toByteArray();//获得字节数组
String result=new String(data, "UTF-8");//通过获取到的字节数组数据实例化一个String对象,编码格式为UTF-8
return result;//返回写入的数据
}
return null;
}
}
(9).最后,千万要记得在AndroidManifest.xml文件添加访问网络的权限,以及那两个Activity,代码如下:
添加访问网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
声明另外两个activity:
<activity android:name="com.android.android_net.ShowNetImageActivity"/>
<activity android:name="com.android.android_net.ShowNetCodeActivity"/>
4.部署我们的项目到Android模拟器上,效果如下:
(1).点击查看网络图片按钮,跳转到ShowNetImageActivity,如下图所示:
点击上图的按钮,如下图:
获取到tomcat服务器上的图片。
(2).如果点击刚开始运行的那个查看网络源码的按钮,将跳转到ShowNetCodeActivity,如下图所示:
点击网络源码按钮,如下图:
这样便获取到网络的源码了。
注:其中要注意的一点是 我们访问网络文件的源码时,要注意网络jsp文件和获取到的字符串的编码问题,否则会出现中文乱码问题。
5.以上内容仅供大家学习参考,写得不好,请见谅,如有错误,请指出,谢谢!
源码下载地址:http://download.csdn.net/download/u012561176/9054209