Android 网络通信之 HttpURLConnection

原创 2015年11月20日 16:40:38

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操作可以适用于大多数的应用程序。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 网络请求HttpURLConnection 和 HttpClient详解

Android一般通过http协议向服务端接口发送请求,常用有POST和GET传输方式。这种请求通常借助于HttpClient,HttpClient 是 Apache Jakarta Common 下...
  • zz_cl
  • zz_cl
  • 2016年10月29日 18:45
  • 745

Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比

比较的指标: 1、cpu 2、流量 3、电量 4、内存占用 5、联网时间 功能点: 1、重试机制 2、提供的扩展功能 3、易用性 4、是否https 5、是否支持reflect api,...
  • zhangcanyan
  • zhangcanyan
  • 2016年06月30日 22:33
  • 23692

Android网络通信之HttpURLConnection

HTTP new URL(urlPath)[ 一个保存了URLPath的URL对象 可通过该对象获取一个网络连接对象 ] URL.openConnection[ 打开网络连接并返回连接对象 ] htt...
  • zw901159
  • zw901159
  • 2016年05月06日 19:41
  • 132

android 网络通信之HttpURLConnection

HttpURLConnectionHttpURLConnectionHttpURLConnectionHttpURLConnectionHttpURLConnection
  • weiyu1992
  • weiyu1992
  • 2017年01月13日 19:23
  • 163

android网络通信之HttpUrlConnection

下面例子为使用HttpUrlConnection的一个登录服务器的小例子。 package com.liang.logindemo; import android.support.v7.app.A...
  • liang5630
  • liang5630
  • 2014年12月14日 11:57
  • 1417

Android开发之网络请求通信专题(一):基于HttpURLConnection的请求通信

在Android开发中,网络请求必然是必不可少。一般而言,都是基于http的网络请求。有时候也会有SOCKET请求,这个后续的专题再讲。今天,我们就先讲讲常用的Http请求。 http求情自然是遵循h...
  • victorfreedom
  • victorfreedom
  • 2015年01月24日 16:50
  • 1709

Android开发之网络通讯详解

真正的才智是刚毅的志向
  • dmk877
  • dmk877
  • 2016年03月16日 21:36
  • 5978

Android 网络通信——HttpURLConnection

Android中的网络通讯方式有多种,这个我们在前一篇文章《Android 网络连接——URLConnection 》中已经提到过,Android网络通信有:支持JDK提供的ServiceScoket...
  • To_be_Designer
  • To_be_Designer
  • 2015年09月14日 22:02
  • 1559

Java网络通信之HttpUrlConnection

Get Post区别: 1.Get数据大小有限制,请求的参数内容直接显示在地址栏里面,相对不安全 2.Post数据没有大小限制,请求的参数内容,不会显示在地址栏里面,相对安全一些一.Get方式请求...
  • a4118000113209
  • a4118000113209
  • 2016年07月30日 11:07
  • 98

Android HttpURLConnection 网络通信实时更新

前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net  ...
  • luckkof
  • luckkof
  • 2014年05月13日 16:29
  • 752
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 网络通信之 HttpURLConnection
举报原因:
原因补充:

(最多只允许输入30个字)