Android之网络通信案例分析

2014-11-06  来源:本站原创  分类:Android  人气:5 

由于一个项目的需要,我研究了一下android的网络通信方式,大体和java平台的很相似,需要的朋友可以参考下

由于一个项目的需要,我研究了一下android的网络通信方式,大体和java平台的很相似!
Android之网络通信案例分析

android平台也提供了很多的API供开发者使用,请按示例图:
Android之网络通信案例分析

首先,介绍一下通过http包工具进行通信,分get和post两种方式,两者的区别是:
1,post请求发送数据到服务器端,而且数据放在html header中一起发送到服务器url,数据对用户不可见,get请求是把参数值加到url的队列中,这在一定程度上,体现出post的安全性要比get高
2,get传送的数据量小,一般不能大于2kb,post传送的数据量大,一般默认为不受限制。
访问网络要加入权限 <uses-permission android:name="android.permission.INTERNET" />
下面是get请求HttpGet时的示例代码:

View Code
// 创建DefaultHttpClient对象
HttpClient httpClient = new DefaultHttpClient();
// 创建一个HttpGet对象
HttpGet get = new HttpGet(
"http://192.168.1.88:8888/foo/secret.jsp");
try
{
// 发送GET请求
HttpResponse httpResponse = httpClient.execute(get);
HttpEntity entity = httpResponse.getEntity();
if (entity != null)
{
// 读取服务器响应
BufferedReader br = new BufferedReader(
new InputStreamReader(entity.getContent()));
String line = null;
response.setText("");
while ((line = br.readLine()) != null)
{
// 使用response文本框显示服务器响应
response.append(line + "\n");
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}

post请求HttpPost的示例代码:

复制代码 代码如下:

View Code
HttpClient httpClient=new DefaultHttpClient();
HttpPost post = new HttpPost(
"http://192.168.1.88:8888/foo/login.jsp");
// 如果传递参数个数比较多的话可以对传递的参数进行封装
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("name", name));
params.add(new BasicNameValuePair("pass", pass));
try
{
// 设置请求参数
post.setEntity(new UrlEncodedFormEntity(
params, HTTP.UTF_8));
// 发送POST请求
HttpResponse response = httpClient
.execute(post);
// 如果服务器成功地返回响应
if (response.getStatusLine()
.getStatusCode() == 200)
{
String msg = EntityUtils
.toString(response.getEntity());
// 提示登录成功
Toast.makeText(HttpClientTest.this,
msg, 5000).show();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}

其次,介绍一下,使用java包的工具进行通信,也分get和post方式
默认使用get方式,示例代码:

复制代码 代码如下:

View Code
try
{
String urlName = url + "?" + params;
URL realUrl = new URL(urlName);
// 打开和URL之间的连接或者HttpUrlConnection
URLConnection conn =realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 建立实际的连接
conn.connect();
// 获取所有响应头字段
Map<String, List<String>> map = conn.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet())
{
System.out.println(key + "--->" + map.get(key));
}
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null)
{
result += "\n" + line;
}
}
catch (Exception e)
{
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流

使用post的示例代码:

复制代码 代码如下:

View Code
try
{
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(params);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null)
{
result += "\n" + line;
}
}
catch (Exception e)
{
System.out.println("发送POST请求出现异常!" + e);
e.printStackTrace();
}

从以上知,get请求只需要conn.connect(),post请求时,必须设置 conn.setDoOutput(true),conn.setDoinput(true),还必须获取URLConnection的输出流getOutputStream()
最后,使用套接字(soket)进行通信分为两种形式:面向连接的(tcp)和无连接的(udp 数据报)
tcp连接示例:

复制代码 代码如下:

View Code
//服务器端
//创建一个ServerSocket,用于监听客户端Socket的连接请求
ServerSocket ss = new ServerSocket(30000);
//采用循环不断接受来自客户端的请求
while (true)
{
//每当接受到客户端Socket的请求,服务器端也对应产生一个Socket
Socket s = ss.accept();
OutputStream os = s.getOutputStream();
os.write("您好,您收到了服务器的消息!\n"
.getBytes("utf-8"));
//关闭输出流,关闭Socket
os.close();
s.close();
}
//客户端
Socket socket = new Socket("192.168.1.88" , 30000);
//将Socket对应的输入流包装成BufferedReader
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
//进行普通IO操作
String line = br.readLine();
show.setText("来自服务器的数据:" + line);
br.close();
socket.close();

udp连接示例:

复制代码 代码如下:

View Code
服务器端:
try {
//创建一个DatagramSocket对象,并指定监听的端口号
DatagramSocket socket = new DatagramSocket(4567);
byte data [] = new byte[1024];
//创建一个空的DatagramPacket对象
DatagramPacket packet = new DatagramPacket(data,data.length);
//使用receive方法接收客户端所发送的数据
socket.receive(packet);
String result = new String(packet.getData(),packet.getOffset(),packet.getLength());
System.out.println("result--->" + result);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
客户端:
try {
//首先创建一个DatagramSocket对象
DatagramSocket socket = new DatagramSocket(4567);
//创建一个InetAddree
InetAddress serverAddress = InetAddress.getByName("192.168.1.104");
String str = "hello";
byte data [] = str.getBytes();
//创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号
DatagramPacket packet = new DatagramPacket(data,data.length,serverAddress,4567);
//调用socket对象的send方法,发送数据
socket.send(packet);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

以上,是我的总结,最近正在做一个类似网络视频客户端的作品,如果大家有人做过这方面,欢迎您们提出建议和实现终端和服务器访问的其他方法。谢谢!
与大家共勉!!!

相关文章
  • Android之网络通信案例分析 2014-11-06

    由于一个项目的需要,我研究了一下android的网络通信方式,大体和java平台的很相似,需要的朋友可以参考下 由于一个项目的需要,我研究了一下android的网络通信方式,大体和java平台的很相似! android平台也提供了很多的API供开发者使用,请按示例图: 首先,介绍一下通过http包工具进行通信,分get和post两种方式,两者的区别是: 1,post请求发送数据到服务器端,而且数据放在html header中一起发送到服务器url,数据对用户不可见,get请求是把参数值加到url

  • Android CheckBox 的使用案例分析 2014-06-03

    本篇文章小编为大家介绍,Android CheckBox 的使用案例分析.需要的朋友参考下 public class MainActivity extends Activity { TextView tv; CheckBox cb1; CheckBox cb2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.la

  • Android SQLite数据库增删改查操作的案例分析 2015-02-24

    本篇文章介绍了,在Android中SQLite数据库增删改查操作的案例分析,需要的朋友参考下 Person实体类 package com.ljq.domain; public class Person { private Integer id; private String name; private String phone; public Person() { super(); } public Person(String name, String phone) { super(); thi

  • Android性能优化案例研究(下) 2013-05-11

    译者前言:在Android性能优化案例研究(上)中,作者Romain Guy将Falcon Pro这款应用作为例子,通过Android现有的工具追踪和分析了其隐藏的性能问题(重绘).下篇作者将会带来如何解决此类问题的方法和思路. 去掉冗余的图层 为 了去掉重绘我们必须首先理解它从哪里产生的.这就轮到Hierarchy Viewer和Tracer for OpenGL大显身手的时候了.Hierarchy Viewer是ADT工具(或者monitor)的一部分,可以被用作对视图层级进行快速解读.在处

  • Android 性能优化案例 2014-01-24

    之前看到一篇关于优化Android性能的文章,写的很不错.但由于一直没有使用过,最近恰好优化Performance,想起了之前看到的博客,就从ImportNew转了过来,译文作者孙立. Android性能优化案例研究(上) 译 者前言: 这是Google的Android开发工程师Romain Guy刊登在个人Blog上的一篇文章.Romain Guy 作为Android图形渲染和系统优化的专家,是Android 4.1中的"黄油项目"开发者之一.这篇译文将分为上下两个部分,上部分将通过

  • 微博营销案例分析:刘强东与西红柿的那点事 2014-06-17

    "西红柿"两天之内红遍整个微博并且成功的引起了传统媒体的关注,相信明天报纸媒体们会有普天盖地的报道,今天一整天因为IT茶馆所在的园区停电没能上网,晚上到家里再想仔细分析的时候才发现几个重要的微博证据已经被博主删除,实在可惜,既然已经在微博上预告要写一个案例分析,就只有凭着自己的记忆,对整件事情做一个简单的梳理,该事件借用了名人.小三.办公室潜规则等话题极大的满足了网友的窥私欲,从一个单条微博开始引起面式扩散,最终演变为一次成功的热点事件,与上次我分析的单条微博大号转发传播又进了一层.

  • Android SharedPreferences的使用分析 2014-09-04

    本篇文章小编为大家介绍,Android SharedPreferences的使用分析.需要的朋友参考下 SharedPreferences用于在开发软件的时候提供软件参数设置,其背后使用的是xml文件存放数据,文件保存在/data/data/<package name>/shared_prefs目录下: public void savePreferences(String name, Integer age) { -->> get SharedPreferences SharedP

  • Android系统源代码情景分析:基础知识 2015-02-16

    目前,互联网行业正在朝着移动互联网方向强劲地发展,而移动互联网的发展离不开背后的移动平台的支撑.众所周知,如今在移动平台市场上,苹果的iOS.谷歌的Android和微软的Windows Phone系统已经形成了三足鼎立的形势,而Android系统的市场占有率是最高的.Android系统之所以能够在市场上占据着第一的位置,一来是因为它依托着谷歌的品德效应和技术实力,二来是因为它是开放的,任何人都可以得到它的源代码,并且能够自由地使用它.既然Android系统是开放的,作为一个移动平台开发人员来说,

  • 艾瑞咨询:电子商务新模式案例分析--中关村商城 2014-01-16

    根据艾瑞咨询<2008-2009年中国网络购物行业发展报告>研究数据显示,08年B2C是网络购物市场的亮点,交易规模同比实现了100%以上的增长.众多企业看好并相继进入B2C,资本市场则持续关注母婴.珠宝等垂直B2C企业,B2C风头再起. 艾瑞咨询为了给电子商务从业人员和关注者提供更快速及有价值的信息,将推出电子商务案例分析系列文章,不定期根据国内外市场新兴企业和模式进行1-3轮测评并推出相关分析文章. 案例分类: 垂直IT网站的电子商务商城(类似案例:小熊在线的小熊商城等) 电子商务服务平台

  • Scrum实施情况调查之案例分析 2014-02-15

    作者李剑,在InfoQ中文站上发表了一篇"Scrum在中国--企业实施情况调查实录".这份调查实录,分别调查了五个实施SCRUM的公司,其中三家公司实施成功,二家公司失败.我建议所有准备或者正在实施SCRUM 的人们都能来读一下. 在此,我们会对这篇文章中的案例分类进行分析.诊断.并探讨什么是敏捷开发方法.什么是SCRUM.使用敏捷方法需要什么条件.它可以解决什么问题以及如何在团队中合理的使用敏捷方法. 什么是敏捷开发方法?什么是SCRUM? 有人在这个字面上下功夫,说敏捷就是反应要灵

  • 交互成本的定义及案例分析 2014-04-20

    本该昨晚就更新上来,却因为家里的破事而耽搁到今天上午.想想最近几个月里有多少个周末甚至工作日的夜晚是以让人身心俱疲的折腾来结束的,自己都懒得计算了.每当这种时候就会觉得,除了日复一日的努力让自己的各种目标尽量实现以外,别无他人别无他法可以依赖.可惜产生认知总是需要付出代价,总是需要经历过才能开始觉察. 平时生活和工作中,与他人之间的互动成本,总是能够被自己很敏感的体察到.往往到最后,互动所产生的收益甚至要被自己忽略掉了,而互动成本几乎要成为决定是否继续保持互动的根本要素:归根结底,也许还是因为自

  • 开心网(Kaixin001.com)市场营销案例分析 2015-03-30

    开心网(Kaixin001.com)市场营销案例分析 --2008年成功互联网营销案例 文/PeiPei 摘要(Abstract): 回顾2008年的中国互联网市场,程炳浩的开心网当属一个可圈可点的经典案例.给我的感觉是有点雷同于90年代腾讯QQ从一个ICQ的模仿者摇身一变在几年以后成为中国第一大IM软件.广受SMCG和年轻品牌客户所喜爱的媒体门户.在这里原有的三大门户的概念(新浪.搜狐.腾讯)已经被QQ小弟的"滴滴"的敲门声打破,改变了原有的市场格局.记得在95年左右路牌广告的标语是

  • 星巴克REST案例分析读后感 2012-03-09

    今天收到InfoQ的推荐邮件,看了标题就很感兴趣,花了一些时间一看,果然是很不错的一个案例分析,同时也让自己学到了不少.大致罗列一下看后的一些文章重点内容.案例地址:http://www.infoq.com/cn/articles/webber-rest-workflow 1.通过REST服务请求完成状态迁移,同时合理利用OPTIONS来查看资源操作权限. 2.合理利用Http Heads来返回资源URI,以及通过ErrorCode来确定操作结果,并且作后处理. 3.通过返回内容指定后续流程资源

  • Android 权限控制代码分析 2013-05-08

    Android 权限控制代码分析 前在文章介绍过android系统管理层次:http://blog.csdn.net/andyhuabing/article/details/7030212 ,这里就核心代码分析一下 android系统充分利用了linux的用户权限管理方法,所以如果需要移植到其它系统,这一块也是一个相当不小的工作量.那么android系统到底是如何使用这些的有利因素呢? 首先需要知道linux权限的两个基本知识: 1. 一个用户可以属于多个组. 2. 一个文件只能属于某个组. 这

  • Android Service(不和用户交互应用组件)案例分析 2014-10-05

    Service是在一段不定的时间运行在后台,不和用户交互应用组件,本文将详细介绍,需要了解的朋友可以参考下 Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过<service>来声明.可以通过contect.startservice和contect.bindserverice来启动. Service和其他的应用组件一样,运行在进程的主线程中.这就是说如果service需要很多耗时或者阻塞的操作,需要在其子线程中实现. servic

  • Android 游戏引擎libgdx 资源加载进度百分比显示案例分析 2014-11-17

    因为案例比较简单,所以简单用AndroidApplication -> Game -> Stage 搭建框架感兴趣的朋友可以参考下 因为案例比较简单,所以简单用AndroidApplication -> Game -> Stage 搭建框架 一.主入口,无特殊 public class App extends AndroidApplication { @Override public void onCreate(Bundle savedInstanceState) { super.

  • android 开发 文件读写应用案例分析 2015-03-30

    在Android应用中保存文件会使用到文件读写技术,本文将详细介绍,需要的朋友可以参考下 一.基本概念 在Android应用中保存文件,保存的位置有两处 ①手机自带的存储空间,较小(如200M),适合保存一些小文件,Android中保存位置在data/data/应用包名/files目录 ②外存储设备如SD卡,较大,适合保存大文件如视频,Android中保存位置在mnt/sdcard目录,androd1.5,android1.6保存在sdcard目录 保存的位置通过android的file exp

  • iPad开发技术与案例分析 2014-02-09

    2010年最热门的电子产品是什么?目前记录看来就是第一天销售30万台的Apple iPad.因为太超过预期的热卖了,让苹果电脑临时决定将出货到其他国家的时间延后一到五个月.这个商品到底有何特殊的地方?让我们历史退到2000年10月 Comdex展览,当时Microsoft比尔•盖茨的在演说中举起Table PC,于是所有的目光便集中在这一个高科技的板子:可以用笔在板子上画画,并写下文章,如此一个神奇的板子.虽然这样的创新想法由在HP制造成真,却因为大尺寸的触屏不便宜,加上不到2小时的电池.价格比

  • SQL Server内存遭遇操作系统进程压榨案例分析 2014-01-01

    最近一台DB服务器偶尔出现CPU报警,我的邮件报警阈值设置的是15%,开始时没当回事,以为是有什么统计类的查询,后来越来越频繁 场景: 最近一台DB服务器偶尔出现CPU报警,我的邮件报警阈(请读yù)值设置的是15%,开始时没当回事,以为是有什么统计类的查询,后来越来越频繁. 探索: 我决定来查一下,究竟是什么在作怪,我排查的顺序如下: 1.首先打开Cacti监控,发现最近CPU均值在某天之后骤然上升,并且可以看到System\Processor Queue Length 和 sqlservr\

  • ImageView的属性android:scaleType的作用分析 2015-03-12

    本篇文章是对ImageView的属性android:scaleType的作用进行了详细的分析介绍,需要的朋友参考下 在网上查了好多资料,大致都雷同,大家都是互相抄袭的,看着很费劲,不好理解,自己总结一下,留着需要看的话来查找. 代码中的例子如下: <ImageView android:id="@+id/iv_bit_1" android:layout_width="@dimen/passcode_width" android:layout_height=&qu