Android 网络通信之 HttpURLConnection

来源:互联网 发布:驱动保护编程 编辑:程序博客网 时间:2024/04/30 11:59

Android 针对 应用层HTTP 协议有两套通信 API 。

第一种:JAVA 提供的标准接口 HttpURLConnection

每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络。请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响。如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字。

第二种: Apache 提供的接口 HttpClient

HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。


在Android 6.0(API 23)中,Google 已经移除了对 Apache HttpClient 相关的类的支持,因此,我们只介绍如何使用 HttpURLConnection 来与服务端进行网络通信


一、我们通过一个小例子来看具体代码,如下图:

1.0 在客户端输入:你好,世界!

这里写图片描述


2.0 服务端收到数据:

这里写图片描述


3.0 客户端收到服务器的相应数据:

这里写图片描述


二、客户端代码

1.0 首先在 AndroidManifest.xml 中加入联网权限:

<uses-permission android:name="android.permission.INTERNET"/>

2.0 activity_main.xml:

<?xml version="1.0" encoding="utf-8"?><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"    android:gravity="center"    tools:context=".MainActivity">    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="请输入您的名字"        android:textSize="30sp"/>    <EditText        android:id="@+id/edit_text"        android:layout_width="240dp"        android:layout_height="wrap_content" />    <Button        android:id="@+id/btn_send"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="发送"/></LinearLayout>

3.0 MainActivity:

package com.lgl.client1;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;public class MainActivity extends AppCompatActivity {    private EditText edit_text;    private Button btn_send;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        edit_text = (EditText) findViewById(R.id.edit_text);        btn_send = (Button) findViewById(R.id.btn_send);        //绑定监听        btn_send.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //启动子线程                SendThread sendThread = new SendThread();                new Thread(sendThread).start();            }        });    }    Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            Bundle bundle = msg.getData();  //获取子线程中传递过来的数据            String str = bundle.getString("result");            Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();        }    };    class SendThread implements Runnable {        @Override        public void run() {            String name = edit_text.getText().toString();   //获取编辑框里的输入值            String URL_PATH = "http://172.17.46.12:8080/AndroidServer/ServerServlet?name=" + name;  //模拟器地址            URL url = null;            HttpURLConnection conn = null;            try {                url = new URL(URL_PATH);    //统一资源定位符,指向互联网资源的指针                conn = (HttpURLConnection) url.openConnection();  //取得连接                conn.setConnectTimeout(5 * 1000);   //设置连接服务器超时值                conn.setRequestMethod("GET");   //设置请求方式                //conn.setRequestMethod("POST");                if(conn.getResponseCode() == 200) { //判断服务器是否响应成功                    InputStream inputStream = conn.getInputStream();    //获取服务器响应流                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));                    String result = bufferedReader.readLine();  //读取响应数据                    Message msg = new Message();    //将数据发送给 Handler                    Bundle bundle = msg.getData();                    bundle.putString("result", result);                    msg.setData(bundle);                    handler.sendMessage(msg);                }            } catch (Exception e) {                e.printStackTrace();            }        }    }}

三、服务端代码

1.0 ServerServlet:

package com.lgl.servlet;import java.io.IOException;import java.io.PrintWriter;import java.text.SimpleDateFormat;import java.util.Date;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 服务器端 */@WebServlet("/ServerServlet")public class ServerServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        request.setCharacterEncoding("utf-8");  //服务器请求编码        response.setCharacterEncoding("utf-8"); //服务器响应编码        //获取客户端数据        String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "utf-8");        System.out.println("客户端传递的数据为:" + name);        //响应数据        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");        String time = sdf.format(new Date());        PrintWriter out = response.getWriter();        out.println("当前时间为:" + time);        out.flush();        out.close();    }    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doGet(request, response);    }}

四、总结:

1.0 HttpURLConnection 是在 HTTP 协议层,针对 URL 进行网络通讯的一种方式。每个 HttpURLConnection 实例都可用于生成单个请求。

2.0 它提供的 API 的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。它是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。

0 0