Android 网络通信——HttpURLConnection
来源:互联网 发布:mac os 文本编辑命令 编辑:程序博客网 时间:2024/05/21 10:23
Android中的网络通讯方式有多种,这个我们在前一篇文章《Android 网络连接——URLConnection 》中已经提到过,Android网络通信有:支持JDK提供的ServiceScoket,Scoket的TCP/IP通信,支持JDK提供的Datagrampacket,DatagramScoket的UDP通信,当然也支持JDK提供的URL, URLConnection通信,除此之外Android内置了HttpClient,这样可以更加方便的发送Http请求和获取Http的响应。
但是在开发中,很少会直接使用HttpURLConnection,大部分都是使用封装好的Volley,XUtils或者其他的网络框架。说到这可能很多和博主一样的初学者就有些犯晕了,怎么那么多网络连接的方式,他们之间到底什么关系,我们可以通过一张图来看一下,这里只列出博主学习过的网络连接方式,当然除这些方式外还有很多:
这一篇我们先来学习HttpURLConnection。HttpURLConnection是Android支持JDK的一种网络连接方式,也就是在Android中HttpURLConnection的使用与Java中是完全相同的,查看Java HttpURLConnection的使用可以参考文章《 HttpUrlConnection网络连接 》。
HttpURLConnection对于网络的请求和提交有两种方式:”GET“,“POST”。“GET”方式提交是将数据添加到URL末尾,“POST”提交数据是将数据封装后提交。
HttpURLConnection GET方式
1. 定义url字符串。
即:将要访问的服务器网址定义为一个字符串,并在字符串的最后加“?”然后加上要传入的数据。
2. 生成URL 。
将定义的字符串生成一个URL类的对象。
3. 打开URL连接 并将其强制造型成HttpUrlConnection类型的对象。
通过URL与服务器建立连接。并将连接强制转换为HttpUrlConnection类型。
4. 设置请求方式。
设置请求方式为”GET“类型,
5. 设置编码类型。
设置接受的数据类型。httpurlconn.setRequestProperty("Accept-Charset", "utf-8");
设置可以接受的序列化的java对象。httpurlconn.setRequestProperty("Context-Type", "application/x-www-form-urlencoded");
6. 获取返回的数据。
获得数据前,我们要先判断是否连接成功,通过获取网络连接的状态码来判断。如果状态码为200,则表明可以正常访问服务器。此时便可获取数据,并对其进行处理。
网络连接必须放在子线程中,主线程中不允许有耗时操作。当然有时将网络连接放在主线程中是不会报错的,但是在实际开发中是不允许的。所有我们这里通过按钮点击创建一个子线程调用doGet()方法连接网络。通过Handler与主线程通信,将返回的数据添加到主线程中。线程部分看不懂的建议看文章《Android中的多线程 》。
public class URLConnectionDemoActivity extends Activity implements View.OnClickListener { private static final int TYPE_CONNECT_GET = 0x666666; private Button mButtonURLConnectionGet; private TextView mTextViewGetConetnt; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case TYPE_CONNECT_GET: String contentGet = (String) msg.obj; mTextViewGetConetnt.setText(contentGet); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_urlconnection_demo); mButtonURLConnectionGet = (Button) findViewById(R.id.button_urlconnection_get); mTextViewGetConetnt = (TextView) findViewById(R.id.textview_urlconnection_get); mButtonURLConnectionGet.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_urlconnection_get: //创建子线程 new Thread(new Runnable() { @Override public void run() { doGet(); } }).start(); break; default: break; } } private void doGet() { StringBuffer buffer = null; try { URL url = new URL("http://192.168.0.44:8080/MyServiceTest/MyTestServlet?username=Ineedyou"); URLConnection urlConnection = url.openConnection(); HttpURLConnection httpurlconn = (HttpURLConnection) urlConnection; httpurlconn.setRequestMethod("GET"); //设置编码格式 //设置接受的数据类型 httpurlconn.setRequestProperty("Accept-Charset", "utf-8"); //设置可以序列化的java对象 httpurlconn.setRequestProperty("Context-Type", "application/x-www-form-urlencoded"); int code = httpurlconn.getResponseCode(); Log.d("data", "获得的状态码是:" + code); if(code== HttpsURLConnection.HTTP_OK){ InputStream is = httpurlconn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line = br.readLine(); buffer = new StringBuffer(); while(line != null){ buffer.append(line); line = br.readLine(); } } Message msg = new Message(); msg.obj = buffer.toString().trim(); msg.what=TYPE_CONNECT_GET; handler.sendMessage(msg); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
HttpURLConnection POST方式
1. 定义url字符串。
即:将要访问的服务器网址定义为一个字符串.
2. 生成URL 。
将定义的字符串生成一个URL类的对象。
3. 打开URL连接 并将其强制造型成HttpUrlConnection类型的对象。
通过URL与服务器建立连接。并将连接强制转换为HttpUrlConnection类型。
4. 设置请求方式。
设置请求方式为”POST“类型,
5. 设置编码类型。
设置接受的数据类型。httpurlconn.setRequestProperty("Accept-Charset", "utf-8");
设置可以接受的序列化的java对象。httpurlconn.setRequestProperty("Context-Type", "application/x-www-form-urlencoded");
6. 设置相关参数
设置可以读取服务器返回的内容。因为默认为true,因此可以不写。
设置客户端可以给用户提交数据。默认为false,setDoOutput(true);必须设置!!!!
设置服务器不允许读缓存!setUseCaches(false);
7. 设置参数String param = “提交的数据内容”;
提交数据getOutputStream().write(byte[] array);
8. 获取返回的数据。
获得数据前,我们要先判断是否连接成功,通过获取网络连接的状态码来判断。如果状态码为200,则表明可以正常访问服务器。此时便可获取数据,并对其进行处理。
这里我们直接看代码:
public class URLConnectionDemoActivity extends Activity implements View.OnClickListener { private static final int TYPE_CONNECT_POST = 0x999999; private Button mButtonURLConnectionPost; private TextView mTextViewPostConetnt; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case TYPE_CONNECT_POST: String contentPost = (String) msg.obj; mTextViewPostConetnt.setText(contentPost); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_urlconnection_demo); mButtonURLConnectionPost = (Button) findViewById(R.id.button_urlconnection_post); mTextViewPostConetnt = (TextView) findViewById(R.id.textview_urlconnection_post); mButtonURLConnectionPost.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_urlconnection_post: new Thread(new Runnable() { @Override public void run() { doPost(); } }).start(); break; default: break; } } private void doPost() { StringBuffer buffer = null; try { URL url = new URL("http://192.168.0.44:8080/MyServiceTest/MyTestServlet"); URLConnection connection = url.openConnection(); HttpURLConnection httpConnection = (HttpURLConnection) connection; httpConnection.setRequestMethod("POST"); //设置编码格式 //设置接受的数据类型 httpConnection.setRequestProperty("Accept-Charset", "utf-8"); //设置可以序列化的java对象 httpConnection.setRequestProperty("Context-Type", "application/x-www-form-urlencoded"); // 设置可以读取服务器返回的内容 //httpConnection.setDoInput(true); //设置服务器接收客户端串入的内容。 httpConnection.setDoOutput(true); //设置不可已接受缓存内容。 httpConnection.setUseCaches(false); //设置传入的参数内容 String params = "username=I want you"; //提交数据 httpConnection.getOutputStream().write(params.getBytes()); int code = httpConnection.getResponseCode(); if(code==HttpURLConnection.HTTP_OK){ System.out.println("获得的连接状态码是:"+code); //从服务器读数据 InputStream is = httpConnection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line = br.readLine(); buffer = new StringBuffer(); while(line!=null){ buffer.append(line); line = br.readLine(); } } Message msg = new Message(); msg.obj = buffer.toString().trim(); msg.what=TYPE_CONNECT_POST; handler.sendMessage(msg); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
- Android 网络通信——HttpURLConnection
- Android——网络通信(HttpUrlConnection)
- Android HttpURLConnection网络通信
- android网络通信之HttpUrlConnection
- Android 网络通信之 HttpURLConnection
- Android网络通信之HttpURLConnection
- android 网络通信之HttpURLConnection
- Android学习篇章44-HttpURLConnection网络通信
- Android HttpURLConnection 网络通信实时更新
- Android入门笔记 - 网络通信 - HttpURLConnection
- android 网络通信之HttpURLConnection与HttpClient
- android网络应用3——HttpURLConnection
- android学习——网络访问HttpURLConnection
- Android中网络请求—HttpClient、HttpURLConnection
- Android通过HttpURLConnection类进行网络通信,获取网络图片
- Android通过HttpURLConnection类进行网络通信,获取网络图片!!!
- Android通过HttpURLConnection类进行网络通信,获取网络图片
- 【代码】Android的网络通信详解HttpUrlConnection和HttpClient
- CodeVS3785 项链
- Android学习——Tween动画
- WinSCP远程连接root用户
- 找到一大堆JAVA商城系统
- Android中Serializable和Parcelable接口
- Android 网络通信——HttpURLConnection
- Java操作Hbase增删改查(附带复合条件查询以及分页查询)
- Eclipse中设置在创建新类时自动生成注释
- UIAlertView使用全解
- Spring中不得不知道的知识
- ios开发使用Basic Auth 认证方式
- Apache Camel异常处理
- imagebutton的src和background有什么区别呢?
- JAVA基础学习--面向对象试题