- 概述
常用的网络编程技术包括:URLConnection、Apache HttpClient、WebService、Volly、
android-async-http、WebView。 - HTTP协议
HTTP是Hyper Text Transfer Protocol(超文本传输协议),它的发展是万维网协会和Internet工作小组IETF合作的结果,最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616.RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。
(1)在TCP/IP协议栈中的位置
HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。
默认HTTP的端口号是80,HTTPS的端口号为443。
HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求没有对应关系。
(2)工作流程
一次HTTP操作称为一个事务,其工作过程分为4步:
1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号,一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。 - HTTP的状态响应码
常见状态代码、状态描述的说明如下:
200 OK:客户端请求成功。
400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
403 Forbidden:服务器收到请求,但是拒绝提供服务。
404 Not Found:请求资源不存在,举个例子:输入了错误的URL
500 Internal Server Error:服务器发生不可预期的错误。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)
检查网络是否可用
public boolean isNetworkConnected(Context context){
if (context!=null){
ConnectivityManager mConnectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo=mConnectivityManager.getActiveNetworkInfo();
if(mNetworkInfo!=null){
return mNetworkInfo.isAvailable();
}
}
return false;
}
坚持WIFI是否可用
public boolean isWifiConnected(Context context){
if (context!=null){
ConnectivityManager mConnectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWiFiNetworkInfo=mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if(mWiFiNetworkInfo!=null){
return mWiFiNetworkInfo.isAvailable();
}
}
return false;
}
坚持MOBILE网络是否可用
public boolean isMobileConnected(Context context){
if (context!=null){
ConnectivityManager mConnectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mMobileNetworkInfo=mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if(mMobileNetworkInfo!=null){
return mMobileNetworkInfo.isAvailable();
}
}
return false;
}
获取当前网络连接的网络类型
public static int getConnectedType(Context context){
if(context!=null){
ConnectivityManager mConnectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo=mConnectivityManager.getActiveNetworkInfo();
if(mNetworkInfo!=null&&mNetworkInfo.isAvailable()){
return mNetworkInfo.getType();
}
}
return -1;
}
- URL
URL:统一资源定位符。web上的每个资源都有唯一的地址,采用的就是URL格式。
显示网络上的图片
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.MalformedURLException;
import java.net.URL;
/**
* 访问网络的操作,必须在工作线程中完成
*/
public class MainActivity extends AppCompatActivity {
private ImageView iv;
private static final int LOAD_SUCCESS =0x1 ;
private final MyHandler handler=new MyHandler(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv=findViewById(R.id.imageView);
}
private static class MyHandler extends Handler{
private final WeakReference<MainActivity> weakReference;
public MyHandler(MainActivity mainActivity){
weakReference=new WeakReference<MainActivity>(mainActivity);
}
@Override
public void handleMessage(Message msg) {
MainActivity mainActivity= weakReference.get();
if (mainActivity!=null){
switch (msg.what){
case LOAD_SUCCESS:
mainActivity.iv.setImageBitmap((Bitmap) msg.obj);
break;
}
}
}
}
public void showNetImageClick(View v){
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url=new URL("https://img01.sogoucdn.com/app/a/100520093/3c28af542f2d49f7-da1566425074a021-49652b4db4e26f742bdf91d5ddf65e2f.jpg");
InputStream in= url.openStream();
Bitmap bitmap=BitmapFactory.decodeStream(in);
Message msg= handler.obtainMessage(LOAD_SUCCESS,bitmap);
handler.sendMessage(msg);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
Android模拟器访问本地服务器IP:10.0.2.2(或真实IP)