Android 网络编程(一)
概述
一。Android平台网络相关API接口
1.java.net.*(标准Java接口)
java.net.*提供与联网有关的类,包括流、数据包套接字(socket)、Internet协议、常见Http处理等。比如:创建URL,以及URLConnection/HttpURLConnection对象、设置链接参数、链接到服务器、向服务器写数据、从服务器读取数据等通信。这些在Java网络编程中均有涉及。
2.org.apache 接口
对于大部分应用程序而言JDK本身提供的网络功能已远远不够,这时就需要Android提供的Apache HttpClient了。它是一个开源项目,功能更加完善,为客户端的Http编程提供高效、最新、功能丰富的工具包支持。
3.Android.net.*(Android网络接口)
常常使用此包下的类进行Android特有的网络编程,如:访问WiFi,访问Android联网信息,邮件等功能。
二。服务器端返回客户端的内容有三种方式
1.以HTML代码的形式返回。
2.以XML字符串的形式返回,做Android开发时这种方式比较多。返回的数据需要通过XML解析(SAX、DOM,Pull,等)器进行解析(必备知识)。
3.以json对象的方式返回。
封装的工具类
- 发送GET请求;
- 发送POST请求;
- 发送文件上传请求;
- 发送XML数据;
package com.kest.util; import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.Map; /**
*
*
* (1)发送GET请求;
*
* (2)发送POST请求;
*
* (3)发送文件上传请求;
*
* (4)发送XML数据;
*/ public class HttpRequestUtil {
/**
* 发送GET请求
*
* @param url
* @param params
* @param headers
* @return URLConnection
* @throws Exception
*/
public static URLConnection sendGetRequest(String url,
Map<String, String> params, Map<String, String> headers)
throws Exception {
StringBuilder sb = new StringBuilder(url);
// 如果是GET请求,则请求参数在URL中
if (params != null && !params.isEmpty()) {
sb.append("?");
for (Map.Entry<String, String> entry : params.entrySet()) {
sb.append(entry.getKey()).append("=")
.append(URLEncoder.encode(entry.getValue(), "UTF-8"))
.append("&");
}
sb.deleteCharAt(sb.length() - 1);
}
URL url1 = new URL(sb.toString());
HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
conn.setRequestMethod("GET");
// 设置请求头
if (headers != null && !headers.isEmpty()) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
conn.setRequestProperty(entry.getKey(), entry.getValue());
}
}
conn.getResponseCode();
return conn;
} /**
* 发送POST请求
*
* @param url
* @param params
* @param headers
* @return URLConnection
* @throws Exception
*/
public static URLConnection sendPostRequest(String url,
Map<String, String> params, Map<String, String> headers)
throws Exception {
StringBuilder sb = new StringBuilder();
// 如果存在参数,则放在HTTP请求体,形如name=aaa&age=10
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
sb.append(entry.getKey()).append("=")
.append(URLEncoder.encode(entry.getValue(), "UTF-8"))
.append("&");
}
sb.deleteCharAt(sb.length() - 1);
}
URL url1 = new URL(url);
HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();
out.write(sb.toString().getBytes("UTF-8"));
if (headers != null && !headers.isEmpty()) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
conn.setRequestProperty(entry.getKey(), entry.getValue());
}
}
conn.getResponseCode(); // 为了发送成功
return conn;
} /**
* 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能: <FORM METHOD=POST
* ACTION="http://192.168.0.200:8080/ssi/fileload/test.do"
* enctype="multipart/form-data"> <INPUT TYPE="text" NAME="name"> <INPUT
* TYPE="text" NAME="id"> <input type="file" name="imagefile"/> <input
* type="file" name="zip"/> </FORM>
*
* @param path
*
* @param params
* 请求参数 key为参数名,value为参数值
* @param file
* 上传文件
*/
public static boolean uploadFiles(String path, Map<String, String> params,
FormFile[] files) throws Exception {
final String BOUNDARY = "---------------------------7da2137580612"; // 数据分隔线
final String endline = "--" + BOUNDARY + "--\r\n";// 数据结束标志 int fileDataLength = 0;
if (files != null && files.length != 0) {
for (FormFile uploadFile : files) {// 得到文件类型数据的总长度
StringBuilder fileExplain = new StringBuilder();
fileExplain.append("--");
fileExplain.append(BOUNDARY);
fileExplain.append("\r\n");
fileExplain.append("Content-Disposition: form-data;name=\""
+ uploadFile.getParameterName() + "\";filename=\""
+ uploadFile.getFilname() + "\"\r\n");
fileExplain.append("Content-Type: "
+ uploadFile.getContentType() + "\r\n\r\n");
fileExplain.append("\r\n");
fileDataLength += fileExplain.length();
if (uploadFile.getInStream() != null) {
fileDataLength += uploadFile.getFile().length();
} else {
fileDataLength += uploadFile.getData().length;
}
}
}
StringBuilder textEntity = new StringBuilder();
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {// 构造文本类型参数的实体数据
textEntity.append("--");
textEntity.append(BOUNDARY);
textEntity.append("\r\n");
textEntity.append("Content-Disposition: form-data; name=\""
+ entry.getKey() + "\"\r\n\r\n");
textEntity.append(entry.getValue());
textEntity.append("\r\n");
}
}
// 计算传输给服务器的实体数据总长度
int dataLength = textEntity.toString().getBytes().length
+ fileDataLength + endline.getBytes().length; URL url = new URL(path);
int port = url.getPort() == -1 ? 80 : url.getPort();
Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);
OutputStream outStream = socket.getOutputStream();
// 下面完成HTTP请求头的发送
String requestmethod = "POST " + url.getPath() + " HTTP/1.1\r\n";
outStream.write(requestmethod.getBytes());
String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";
outStream.write(accept.getBytes());
String language = "Accept-Language: zh-CN\r\n";
outStream.write(language.getBytes());
String contenttype = "Content-Type: multipart/form-data; boundary="
+ BOUNDARY + "\r\n";
outStream.write(contenttype.getBytes());
String contentlength = "Content-Length: " + dataLength + "\r\n";
outStream.write(contentlength.getBytes());
String alive = "Connection: Keep-Alive\r\n";
outStream.write(alive.getBytes());
String host = "Host: " + url.getHost() + ":" + port + "\r\n";
outStream.write(host.getBytes());
// 写完HTTP请求头后根据HTTP协议再写一个回车换行
outStream.write("\r\n".getBytes());
// 把所有文本类型的实体数据发送出来
outStream.write(textEntity.toString().getBytes());
// 把所有文件类型的实体数据发送出来
if (files != null && files.length != 0) {
for (FormFile uploadFile : files) {
StringBuilder fileEntity = new StringBuilder();
fileEntity.append("--");
fileEntity.append(BOUNDARY);
fileEntity.append("\r\n");
fileEntity.append("Content-Disposition: form-data;name=\""
+ uploadFile.getParameterName() + "\";filename=\""
+ uploadFile.getFilname() + "\"\r\n");
fileEntity.append("Content-Type: "
+ uploadFile.getContentType() + "\r\n\r\n");
outStream.write(fileEntity.toString().getBytes());
if (uploadFile.getInStream() != null) {
byte[] buffer = new byte[1024];
int len = 0;
while ((len = uploadFile.getInStream()
.read(buffer, 0, 1024)) != -1) {
outStream.write(buffer, 0, len);
}
uploadFile.getInStream().close();
} else {
outStream.write(uploadFile.getData(), 0,
uploadFile.getData().length);
}
outStream.write("\r\n".getBytes());
}
}
// 下面发送数据结束标志,表示数据已经结束
outStream.write(endline.getBytes());
BufferedReader reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
if (reader.readLine().indexOf("200") == -1) {// 读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败
return false;
}
outStream.flush();
outStream.close();
reader.close();
socket.close();
return true;
} /**
* 提交数据到服务器
*
* @param path
*
* @param params
* 请求参数 key为参数名,value为参数值
* @param file
* 上传文件
*/
public static boolean uploadFile(String path, Map<String, String> params,
FormFile file) throws Exception {
return uploadFiles(path, params, new FormFile[] { file });
} /**
* 将输入流转为字节数组
*
* @param inStream
* @return
* @throws Exception
*/
public static byte[] read2Byte(InputStream inStream) throws Exception {
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
return outSteam.toByteArray();
} /**
* 将输入流转为字符串
*
* @param inStream
* @return
* @throws Exception
*/
public static String read2String(InputStream inStream) throws Exception {
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
return new String(outSteam.toByteArray(), "UTF-8");
} /**
* 发送xml数据
*
* @param path
* 请求地址
* @param xml
* xml数据
* @param encoding
* 编码
* @return
* @throws Exception
*/
public static byte[] postXml(String path, String xml, String encoding)
throws Exception {
byte[] data = xml.getBytes(encoding);
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "text/xml; charset=" + encoding);
conn.setRequestProperty("Content-Length", String.valueOf(data.length));
conn.setConnectTimeout(5 * 1000);
OutputStream outStream = conn.getOutputStream();
outStream.write(data);
outStream.flush();
outStream.close();
if (conn.getResponseCode() == 200) {
return read2Byte(conn.getInputStream());
}
return null;
}
}
Android 网络编程(一)的更多相关文章
- Android网络编程只局域网传输文件
Android网络编程之局域网传输文件: 首先创建一个socket管理类,该类是传输文件的核心类,主要用来发送文件和接收文件 具体代码如下: package com.jiao.filesend; im ...
- Android网络编程基础
Android网络编程只TCP通信 TCP 服务器端工作的主要步骤如下.步骤1 调用ServerSocket(int port)创建一个ServerSocket,并绑定到指定端口上.步骤2 调用acc ...
- Android网络编程系列 一 TCP/IP协议族
在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...
- Android网络编程系列 一 Socket抽象层
在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽 ...
- Android 网络编程 Socket
1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...
- Android网络编程概述
Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包 ...
- Android网络编程http派/申请服务
最近的研究Android网络编程知识,这里有一些想法,今晚学习.与您分享. 在实际的应用程序的开发非常需要时间appserver请求数据,那么app怎样发送请求呢?以下的代码就是当中的一种情况.使用H ...
- 转 Android网络编程之使用HttpClient批量上传文件 MultipartEntityBuilder
请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 http://www.tuicool.com/articles/Y7reYb 我曾在<Andr ...
- Android网络编程要学的东西与Http协议学习
本节引言: 本节开始我们来学习Android网络编程相关的一些东西:Android端网络编程是要干嘛?http协议的学习,使用自带扣脚Json解析类解析Json,XML解析常用的几种方式,HttpUr ...
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
随机推荐
- 二、安装JDK - Java软件的安装
jdk是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序. 1.安装包的下载:http://pan.baidu.com/s/1mgh58ve (该安装包是绿色的,解压 ...
- 爬虫学习--Day4(小猿圈爬虫开发_2)
requests模块 - urllib模块 - requests模块 requests模块:python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高.作用:模拟浏览器发送请求. 如 ...
- 如何处理消息队列消费过程中的重复消息&如何实现幂等性
什么是幂等 幂等本来是数学上的概念,它的定义是这样的: 如果一个函数 f(x) 满足:f(f(x)) = f(x),则函数 f(x) 满足幂等性. 在计算机领域用来描述一个操作.方法或者服务.一个幂等 ...
- 1000m交叉网线最简单做法
1-3,2-6,3-1,4-7,5-8,6-2,7-4,8-5 1,2,3,4,5,6,7,8即为网线内部8跟线编号,两头颜色和数字要对应.
- swoole不断的切换前端链接方法 防止攻击
php不断的切换前端链接方法 防止攻击 swoole写法 每分钟生成一次url后缀 返回到客户端让他们更新 //定时器要写在WorkerStart这个里面哦$ws->on('WorkerStar ...
- Unity入门--实用知识
目录 1. VS适配 2.实用快捷操作 3.Unity API文档 4.项目整理 1. VS适配 让你的VS完美支持Unity的脚本编写可以让你写起C#脚本来事半功倍,比如代码补全功能,可以参考下面这 ...
- Jenkins+pipeline+参数构建+人工干预确定
Jenkins+pipeline+参数构建+人工干预 实现了以下功能 1. 可以选择环境,单选:可以选择需要发布的项目,多选 2.发布过程可视化 3. 可以人工干预是否继续发布. 初始化配置需要很久, ...
- .NET后端知识汇总
C#.net系列后端知识点汇总(也有些许数据库.svn等),他山之石. 1..net相关技术:XML.webservice.SOAP,其中webservice使用三大技术:XML.SOAP.WSDL. ...
- 问题:做EsayUI分页报错 $(...).pagination is not a function之后我把<jsp:include page="top.jsp"/>去掉就好了,有大神知道为什么吗?另外分页按键放在那里好些,我放到form表单下,就开始显示,点一下后就没有了
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- (C#)WPF:Grid面板介绍
Grid:网格面板 Grid和其他各个Panel比较起来,功能最多也最为复杂.要使用Grid,首先要向RowDefinitions和ColumnDefinitions属性中添加一定数量的RowDefi ...