Android之网络通信案例分析
发布时间:2023-10-21 02:13:20
由于一个项目的需要,我研究了一下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时的示例代码:
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();
}
以上,是我的总结,最近正在做一个类似网络视频客户端的作品,如果大家有人做过这方面,欢迎您们提出建议和实现终端和服务器访问的其他方法。谢谢!
与大家共勉!!!
猜你喜欢
- 创建hander文件夹在 java 源码目录下创建hander文件夹, 在该文件夹下创建CustomAuthenticationFailHa
- C# 获取某个时间的0点0分和23点59分59秒,具体代码如下所示:C#获取当月第一天和最后一天当月第一天0时0分0秒:DateTime.N
- springMVC的生命周期,听到的时候都没有反应过来,springMVC还有生命周期?现在看来生命周期就是springMVC的流程,Spr
- 目录一、连接查询:1、多对一:2、一对多:3、多对多:二、嵌套查询:1、多对一:2、一对多:首先在mysql中确立表:#表一:地址国家表CR
- 1. 基础知识集合Java.util包下的常用子类,集合无非就是各种数据结构的应用。集合存在的目的就是为了将数据高效的进行读写,无论哪种具体
- Mybatis typeAlias配置1.定义别名<typeAliases> <ty
- 本文实例分析了C# SQlite操作方法。分享给大家供大家参考,具体如下:最近项目需求用C#保存一些数据,如此先总结一下。需要下载Sqlit
- 本文实例讲述了Java文件操作工具类fileUtil。分享给大家供大家参考,具体如下:package com.gcloud.common;i
- Redis 简介Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。Redis 与其他 key - v
- 使用mybatis-plus自动生成了5个模块(xml/bean/mapper/service/controller)的代码,这里练习一下m
- 一、JNDI是什么?JNDI--Java 命名和目录接口(Java Naming and Directory Interface),是一组在
- 1.Quartz是什么?Quartz是一个开源的Java调度框架,可以用来实现在指定的时间或时间间隔触发任务执行的功能。它支持多种方式的作业
- 前言作为一个后端程序员,网络连接这块是一个绕不过的砍,当你在做服务器优化的时候,网络优化也是其中一环,那么作为网络连接中最基础的部分-TCP
- 一、概要我们可以用java实现简单的登录界面。如上效果,直观但也需要一步一步来完成,从界面弹窗的设置,图片的插入,文本框的设置,到登录的按钮
- 向shell提供命令非常简单,需要学习的注解很少。该命令的实现风格与使用依赖注入的应用程序的开发类相同,您可以利用Spring容器的所有特性
- 文件存储文件存储方式不受类型限制,可以将一些数据直接以文件的形式保存在设备中,例如文本文件、PDF ,音频,图片等。存储类型复杂的数据时,通
- 为什么需要在应用程序中增加渠道信息?Android应用的发布需要面对各种各样的市场,我们称之为渠道。有的时候,我们需要知道应用是从哪个渠道下
- 第一步:下载JDK地址:http://www.oracle.com/technetwork/java/javase/downloads/in
- 举个例子Map < String , Object > jsonMap = new HashMap< String , O
- 今天在做项目的时候突然遇到一个问题:启动服务器的时候spring没报错,可是当我访问某个页面的时候spring报Request bean i