Android 网络通信之 HttpURLConnection
2015-11-20 16:40
423 查看
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 来与服务端进行网络通信
2.0 服务端收到数据:
3.0 客户端收到服务器的相应数据:
2.0 activity_main.xml:
3.0 MainActivity:
2.0 它提供的 API 的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。它是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。
第一种: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操作可以适用于大多数的应用程序。
相关文章推荐
- HttpClient4.3教程 第三章 Http状态管理
- HttpClient4.3教程 第二章 连接管理
- HTTP中的get和post的区别
- HttpClient 4.3教程 第一章 基本概念
- HttpClient请求网络 xml解析
- 想深入了解TCP机制和相关参数优化吗(下)
- iOS xcode 7网络请求错误failure Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded
- 网络错误定位案例 ICMP host *** unreachable - admin prohibited
- Android-HTTP实例——使用GET方法、POST方法发送请求(安卓4.0以下版本)
- HTTP协议的8种请求类型介绍
- 从TCP协议的原理来谈谈rst复位攻击
- 网络通信
- 基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎
- AFNetWorking初探之AFHTTPRequestOperation(二)
- tcp 出现rst情况整理
- socket网络编程中read与recv区别
- android网络编程之——客户端上传信息的代码
- Nginx配置https访问
- 【转】Jmeter Http请求界面解释
- 虚拟机ping不通主机