安卓学习日记——网络连接与概述

  • 概述
    常用的网络编程技术包括: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)

猜你喜欢

转载自blog.csdn.net/chen_xiaoke/article/details/89315778