HTTP连接网络
一.HTTP初识
1.HTTP协议简介:
HTTP (Hypertext Transfer Protocol )”超文本传输协议”,是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种协议。
2.Get与Post的主要区别
简单来说:Get与Post就是基于http协议的网络数据交互方式。
1.Get请求属于明文传参,地址栏可以看见参数,调用简单不安全数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
POST把提交的数据则放置在是HTTP包的包体中。
- 2.get是把参数数据队列加到表单的 ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到,实际上就是URL拼接方式。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。
- 3.get 传送的数据量较小,不能大于1KB[IE,Oher:4]。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
- 4.get安全性非常低,post安全性较高。
二.使用HTTP完成网络连接的步骤
1.我们使用一个简单的例子:在点击按钮后访问完成连接,并在控制台打印一句话。
- 步骤一. 创建URL对象
创建一个连接网络的方法getWeb()
private void getWeb() {
/* URL url=new URL("https://www.baidu.com/");需要异常处理*/
try {
URL url=new URL("https://www.baidu.com/");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
InputStream inputStream=connection.getInputStream();
InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
String temp="";
StringBuffer stringBuffer=new StringBuffer();
while ((temp=bufferedReader.readLine())!=null){
stringBuffer.append(temp);
}
Log.d("连接成功------------------", "getWeb: ");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
在按钮的点击事件中调用
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
getWeb();
}
}).start();
}
});
注意: 最后需要在注册文件中添加请求
注意:
- URL url=new URL(“https://www.baidu.com/“); URL的书写格式”/”结束。
- 单击事件中要创建一个子线程,访问网络也属于耗时操作,不可以在主线程中进行。
2.实现网络图片的访问
点击访问图片按钮
package com.example.a22120.day5_http_class;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.nfc.Tag;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
private Button btn,btn_img;
private ImageView image_http;
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用handler实现在主线程中更新UI的操作
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bitmap bi= (Bitmap) msg.obj;
image_http.setImageBitmap(bi);
}
};
btn=findViewById(R.id.fw);
btn_img=findViewById(R.id.btn_tp);
image_http=findViewById(R.id.img_http);
btn_img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
getWebImg();
}
}).start();
}
});
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
getWeb();
}
}).start();
}
});
}
//访问网络图片的方法
private void getWebImg() {
try {
URL url=new URL("http://img1.imgtn.bdimg.com/it/u=4054610911,701962612&fm=27&gp=0.jpg");
HttpURLConnection httpURLConnection= (HttpURLConnection) url.openConnection();
InputStream inputStream=httpURLConnection.getInputStream();
Bitmap bitmap=BitmapFactory.decodeStream(inputStream); //bitmapFactory birmap加工厂
Message message=handler.obtainMessage();
message.obj=bitmap;
handler.sendMessage(message);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void getWeb() {
/* URL url=new URL("https://www.baidu.com/");需要异常处理*/
try {
URL url=new URL("https://www.baidu.com/");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
InputStream inputStream=connection.getInputStream();
InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
String temp="";
StringBuffer stringBuffer=new StringBuffer();
while ((temp=bufferedReader.readLine())!=null){
stringBuffer.append(temp);
}
Log.d("连接成功------------------", "getWeb: ");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
UI代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.a22120.day5_http_class.MainActivity">
<Button
android:layout_width="match_parent"
android:text="访问网络"
android:id="@+id/fw"
android:layout_height="wrap_content" />
<Button
android:layout_width="match_parent"
android:text="访问网络图片"
android:id="@+id/btn_tp"
android:layout_height="wrap_content" />
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:id="@+id/img_http"/>
</LinearLayout>
三.String StringBuffer StringBuilder有什么区别
String
字符串常量,String 是不可变的对象
StringBuffer
字符串变量(线程安全,多线程下操作大量的数据用StringBuffer)
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。
StringBuilder
字符串变量(非线程安全,单线程下操作大量的数据就使用StringBuilder)
在执行速度上:StringBuilder–>StringBuffer–>String
String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象。StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。