Android之网络通信

标签: android 网络 通信 | 发表时间:2012-11-21 01:18 | 作者:woyuchengxian
出处:http://www.cnblogs.com/

 

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

android平台也提供了很多的API供开发者使用,请按示例图:

首先,介绍一下通过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时的示例代码:

1 // 创建DefaultHttpClient对象
2 HttpClient httpClient = new DefaultHttpClient();
3 // 创建一个HttpGet对象
4 HttpGet get = new HttpGet(
5 "http://192.168.1.88:8888/foo/secret.jsp");
6 try
7 {
8 // 发送GET请求
9 HttpResponse httpResponse = httpClient.execute(get);
10 HttpEntity entity = httpResponse.getEntity();
11 if (entity != null)
12 {
13 // 读取服务器响应
14 BufferedReader br = new BufferedReader(
15 new InputStreamReader(entity.getContent()));
16 String line = null;
17 response.setText("");
18 while ((line = br.readLine()) != null)
19 {
20 // 使用response文本框显示服务器响应
21 response.append(line + "\n");
22 }
23 }
24 }
25 catch (Exception e)
26 {
27 e.printStackTrace();
28 }
29 }

post请求HttpPost的示例代码:

1 HttpClient httpClient=new DefaultHttpClient();
2 HttpPost post = new HttpPost(
3 "http://192.168.1.88:8888/foo/login.jsp");
4 // 如果传递参数个数比较多的话可以对传递的参数进行封装
5 List<NameValuePair> params = new ArrayList<NameValuePair>();
6 params.add(new BasicNameValuePair("name", name));
7 params.add(new BasicNameValuePair("pass", pass));
8 try
9 {
10 // 设置请求参数
11 post.setEntity(new UrlEncodedFormEntity(
12 params, HTTP.UTF_8));
13 // 发送POST请求
14 HttpResponse response = httpClient
15 .execute(post);
16 // 如果服务器成功地返回响应
17 if (response.getStatusLine()
18 .getStatusCode() == 200)
19 {
20 String msg = EntityUtils
21 .toString(response.getEntity());
22 // 提示登录成功
23 Toast.makeText(HttpClientTest.this,
24 msg, 5000).show();
25 }
26 }
27 catch (Exception e)
28 {
29 e.printStackTrace();
30 }
31 }

其次,介绍一下,使用java包的工具进行通信,也分get和post方式

默认使用get方式,示例代码:

1 try
2 {
3 String urlName = url + "?" + params;
4 URL realUrl = new URL(urlName);
5 // 打开和URL之间的连接或者HttpUrlConnection
6 URLConnection conn =realUrl.openConnection();
7 // 设置通用的请求属性
8 conn.setRequestProperty("accept", "*/*");
9 conn.setRequestProperty("connection", "Keep-Alive");
10 conn.setRequestProperty("user-agent",
11 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
12 // 建立实际的连接
13 conn.connect();
14 // 获取所有响应头字段
15 Map<String, List<String>> map = conn.getHeaderFields();
16 // 遍历所有的响应头字段
17 for (String key : map.keySet())
18 {
19 System.out.println(key + "--->" + map.get(key));
20 }
21 // 定义BufferedReader输入流来读取URL的响应
22 in = new BufferedReader(
23 new InputStreamReader(conn.getInputStream()));
24 String line;
25 while ((line = in.readLine()) != null)
26 {
27 result += "\n" + line;
28 }
29 }
30 catch (Exception e)
31 {
32 System.out.println("发送GET请求出现异常!" + e);
33 e.printStackTrace();
34 }
35 // 使用finally块来关闭输入流

使用post的示例代码:

1 try
2 {
3 URL realUrl = new URL(url);
4 // 打开和URL之间的连接
5 URLConnection conn = realUrl.openConnection();
6 // 设置通用的请求属性
7 conn.setRequestProperty("accept", "*/*");
8 conn.setRequestProperty("connection", "Keep-Alive");
9 conn.setRequestProperty("user-agent",
10 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
11 // 发送POST请求必须设置如下两行
12 conn.setDoOutput(true);
13 conn.setDoInput(true);
14 // 获取URLConnection对象对应的输出流
15 out = new PrintWriter(conn.getOutputStream());
16 // 发送请求参数
17 out.print(params);
18 // flush输出流的缓冲
19 out.flush();
20 // 定义BufferedReader输入流来读取URL的响应
21 in = new BufferedReader(
22 new InputStreamReader(conn.getInputStream()));
23 String line;
24 while ((line = in.readLine()) != null)
25 {
26 result += "\n" + line;
27 }
28 }
29 catch (Exception e)
30 {
31 System.out.println("发送POST请求出现异常!" + e);
32 e.printStackTrace();
33 }

从以上知,get请求只需要conn.connect(),post请求时,必须设置 conn.setDoOutput(true),conn.setDoinput(true),还必须获取URLConnection的输出流getOutputStream()

最后,使用套接字(soket)进行通信分为两种形式:面向连接的(tcp)和无连接的(udp 数据报)

tcp连接示例:

//服务器端
//创建一个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连接示例:

1 服务器端:
2 try {
3 //创建一个DatagramSocket对象,并指定监听的端口号
4 DatagramSocket socket = new DatagramSocket(4567);
5 byte data [] = new byte[1024];
6 //创建一个空的DatagramPacket对象
7 DatagramPacket packet = new DatagramPacket(data,data.length);
8 //使用receive方法接收客户端所发送的数据
9 socket.receive(packet);
10 String result = new String(packet.getData(),packet.getOffset(),packet.getLength());
11 System.out.println("result--->" + result);
12 } catch (Exception e) {
13 // TODO Auto-generated catch block
14 e.printStackTrace();
15
16
17 客户端:
18
19 try {
20 //首先创建一个DatagramSocket对象
21 DatagramSocket socket = new DatagramSocket(4567);
22 //创建一个InetAddree
23 InetAddress serverAddress = InetAddress.getByName("192.168.1.104");
24 String str = "hello";
25 byte data [] = str.getBytes();
26 //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号
27 DatagramPacket packet = new DatagramPacket(data,data.length,serverAddress,4567);
28 //调用socket对象的send方法,发送数据
29 socket.send(packet);
30 } catch (Exception e) {
31 // TODO Auto-generated catch block
32 e.printStackTrace();
33 }

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

与大家共勉!!!

 

本文链接

相关 [android 网络 通信] 推荐:

Android之网络通信

- - 博客园_首页
由于一个项目的需要,我研究了一下android的网络通信方式,大体和java平台的很相似. android平台也提供了很多的API供开发者使用,请按示例图:. 首先,介绍一下通过http包工具进行通信,分get和post两种方式,两者的区别是:. 1,post请求发送数据到服务器端,而且数据放在html header中一起发送到服务器url,数据对用户不可见,get请求是把参数值加到url的队列中,这在一定程度上,体现出post的安全性要比get高.

Android Activity与Service通信

- - CSDN博客移动开发推荐文章
一、当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现.      当一个Activity绑定到一个Service上时,它负责维护Service实例的引用,允许你对正在运行的Service进行一些方法调用. 比如你后台有一个播放背景音乐的Service,这时就可以用这种方式来进行通信.

Android 进程间通信

- - SegmentFault 最新的文章
单例居然失效了,一个地方设置值,另个地方居然取不到,这怎么可能. 排查半天,发现这两就不在一个进程里,才恍然大悟……. 按照操作系统中的描述:进程一般指一个执行单元,在 PC 和移动设备上指一个程序或者一个应用. 我们都知道,系统为 APP 每个进程分配的内存是有限的,如果想获取更多内存分配,可以使用多进程,将一些看不见的服务、比较独立而又相当占用内存的功能运行在另外一个进程当中.

android执行网络操作

- - ITeye博客
本篇我们会介绍连接到网络中涉及的基本任务,监测的网络连接(包括连接更改),并给予用户控制应用程序的网络使用情况. 还介绍了如何解析和使用XML数据. 这个类包含一个示例应用程序来说明如何执行常见的网络操作. 您可以下载示例(在右边),并用它作为自己的应用程序源代码的可重用代码. 在mainfest中声明权限,代码如下:.

MINA网络通信框架

- - 淘宝网通用产品团队博客
Apache MINA 2是一个开发高性能和高可伸缩性网络应用程序的网络应用框架. 它提供了一个抽象的事件驱动的异步API,可以使用TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式. Apache MINA 2可以作为开发网络应用程序的一个良好基础. Mina 的API 将真正的网络通信与我们的应用程序隔离开来,你只需要关心你要发送、.

Netty实现网络通信

- - 互联网 - ITeye博客
原文同步至  http://www.waylau.com/netty-chat/. Netty 是一个 Java NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议. Netty 大大简化了网络程序的开发过程比如 TCP 和 UDP 的 socket 服务的开发.

android跨进程通信(IPC):使用AIDL

- - CSDN博客移动开发推荐文章
AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码. 如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数.

android 进程间通信方式

- - 移动开发 - ITeye博客
由于android系统中应用程序之间不能共享内存. 因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些. 在android SDK中提供了4种用于跨进程通讯的方式. 这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service.

Android WebView与Native通信总结

- - 掘金 架构
当前移动端App的开发很多都需要内嵌WebView来方便业务的快速开展,特别是电商App中,业务变化快,活动多. 仅仅依靠native的开发方式难以满足快速的业务发展,于是混合开发模式便出现. 当前比较知名的有 Cordova,. Ionic, 国内的有 Appcan,. APICloud开发平台,这几种都是依赖于WebView的实现.

Android之网络丢包事件

- - 开源小站
有那么一个应用,同样的服务器端,同样的Wi-Fi网络下,Android连接速度总是慢过iphone一个数量级. 起先怀疑跟Android的硬件有关,无奈的是通过3G甚至于2G EDGE无线连接,速度均超过Wi-Fi. 然后这个责任就一把归结到了“Android不如iPhone”,“Android七拼八凑”之类无休止的平台沙文主义之上了.