安卓开发软件:AndroidStudio
服务器软件:Myeclipse+Tomcat
首先无论是哪种方式,安卓手机软件要想联网,必须要申请联网权限(android.permission.INTERNET)。
安卓主线程不允许做耗时操作(联网操作就是一种耗时操作),所以下面的的网络操作都是通过内部匿名类另起的一个线程操作的。
一,第一种方式:使用HttpURLConnection进行联网操作
这个方法需要我们手动构建一个http请求包,发送到指定的服务器
-
get方式
- 设置URL
- 打开连接
- 设置请求方法为get
- 设置连接超时时间
- 设置读取超时时间
- 把当前的request发送到服务器端
- 等待服务器的响应(此处会阻塞)
- 获得响应码(并在响应码中做相应的操作),因为安卓子线程内不允许做UI更新的操作,所以需要转到主线程来做(通过安卓中的handler来将信息传递到主线程)
public void getPic(View v){
new Thread(new Runnable() {
@Override
public void run() {
try {
//首先要支出服务器的地址
URL url=new URL("http://192.168.2.1/day10_NetworkServer/brushli.jpg");
//通过http连接
HttpURLConnection httpurlConnection = (HttpURLConnection) url.openConnection();
//设置请求方式,并设置等待响应时间
httpurlConnection.setRequestMethod("GET");
httpurlConnection.setConnectTimeout(5000);
//把当前的request发送到服务器(安卓不允许在主线程内做耗时操作,如连接服务器)
httpurlConnection.connect();
//发送完连接后等待操作,这个是阻塞式方法,
int responseCode = httpurlConnection.getResponseCode(); //根据得到的响应代码和response的信息作出相应的操作
if(responseCode==200){
//从服务器读取正确与否的信息
InputStream is=httpurlConnection.getInputStream();
File file=new File("/data/data/com.rgd.day10_network_3/files");
file.mkdir();
FileOutputStream fos=new FileOutputStream(new File("/data/data/com.rgd.day10_network_3/files/brushli.jpg"));
byte[] buffer=new byte[1024];
int read;
while ((read =is.read(buffer))!=-1){
fos.write(buffer,0,read);
}
//由于子线程不允许做UI更新操作,与要通过Handler进行和主线程的通信操作 Message msg=new Message();
msg.what=1;
handler.sendMessage(msg);
fos.close();
is.close(); }
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
}).start(); }
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what){
case 1:
Toast.makeText(MainActivity.this, "保存图片成功", Toast.LENGTH_LONG).show();
break;
case 2:
Toast.makeText(MainActivity.this,"保存MP3成功",Toast.LENGTH_LONG).show();
break;
case 3:
Toast.makeText(MainActivity.this,"保存视频成功",Toast.LENGTH_SHORT).show();
default:
break;
}
}
};
2.post方式
- 操作跟get差不多,除了post传递信息是通过正文传递的,而get是放在连接中的
new Thread(new Runnable() {
@Override
public void run() {
try {
//首先要支出服务器的地址
URL url=new URL("http://192.168.106.1/day10_NetworkServer/servlet/loginInfo");
//通过http连接
HttpURLConnection httpurlConnection = (HttpURLConnection) url.openConnection();
//设置请求方式,并设置等待响应时间
httpurlConnection.setRequestMethod("POST");
httpurlConnection.setConnectTimeout(5000); String data="username="+username+"&password="+password+"&email="+email+"&phonenumber="+phonenumber;
OutputStream outputStream = httpurlConnection.getOutputStream();
outputStream.write(data.getBytes());
//把当前的request发送到服务器(安卓不允许在主线程内做耗时操作,如连接服务器)
httpurlConnection.connect();
//发送完连接后等待操作,这个是阻塞式方法,
int responseCode = httpurlConnection.getResponseCode(); //根据得到的响应代码和response的信息作出相应的操作
if(responseCode==200){
//从服务器读取正确与否的信息
InputStream is=httpurlConnection.getInputStream();
byte[] buffer=new byte[1024];
int read = is.read(buffer);
String result=new String(buffer,0,read);
//由于子线程不允许做UI更新操作,与要通过Handler进行和主线程的通信操作
Message msg=new Message();
msg.what=1;
handler.sendMessage(msg); }else{
Message msg=new Message();
msg.what=-1;
handler.sendMessage(msg);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
}).start();
3.通过