Android4开发入门经典 之 第十一部分:网络编程【私塾在线原创】

基于Socket的网络编程

Android的网络编程部分,基本上和Java的网络编程是一样的,基本上也分成两种,一种是基于Socket的,另外一种是基于Http协议的。
基于Socket的基本用法,跟Java里面的用法一样,简单回顾一下:
一:服务端
1:启动一个服务器端的socket:ServerSocket server = new ServerSocket(1234);
2:开始侦听请求:Socket client = server.accept();
3:取得输入和输出流:
4:然后就可以通过流来进行网络传输了
5:最好要记得关闭流和Server

java代码:
ServerSocket server=new ServerSocket(1234);  
Socket client=server.accept();  
InputStream in = client.getInputStream();  
OutputStream ut=client.getOutputStream();  
 
byte bs[] = new byte[1024];
in.read(bs);
String str= new String(bs);
System.out.println(str);  
out.write("Server send".getBytes());  
out.flush();
client.close();

二:客户端:
1:发起一个socket连接:Socket server = new Socket("192.168.1.2",1234);
2:取得输入和输出流:
3:然后就可以通过流来进行网络传输了
4:最好要记得关闭流和Socket

java代码:
String str = "client send";
out.write(str.getBytes());
out.flush();
 
byte bs[] = new byte[1024];
in.read(bs);
System.out.println(new String(bs));
server.close();
当然这样实现很不好,应该包装成上层的流或者Reader、Writer来做。
包装成Reader和Writer的服务端示例:
 
java代码:
ServerSocket server=new ServerSocket(1234);  
Socket client=server.accept();  
BufferedReader in= 
new BufferedReader(new InputStreamReader(client.getInputStream()));  
PrintWriter ut=new PrintWriter(client.getOutputStream());  
String str=in.readLine();  
System.out.println(str);  
out.println("Server send");  
out.flush();
包装成Reader和Writer的客户端示例:

java代码:
Socket server = new Socket("192.168.0.100", 1234);
BufferedReader in = new BufferedReader(new InputStreamReader(
server.getInputStream()));
PrintWriter ut = new PrintWriter(server.getOutputStream());
String str = "client send";
out.println(str);
out.flush();
System.out.println(in.readLine());
server.close();

使用HttpURLConnection

基于Http协议的基本用法,可以使用HttpURLConnection,也可以使用Apache的Http操作包,具体的使用方式下面分别来示例。
要让应用使用网络,需要在Manifest文件中添加权限:

java代码:

HttpURLConnection默认使用get的方式与后台交互
HttpURLConnection conn = null;
try {
URL  u = new URL("http://192.168.0.100:8080/test.jsp?uuid=123");
conn = (HttpURLConnection)u.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
while((line=br.readLine())!=null){
Log.i("NetTest","lien="+line);
}
} catch (Exception e) {e.printStackTrace();}
finally{ conn.disconnect();}
请注意一点,在Android3.0以上的版本里面,已经不允许直接在Activity里面进行网络的处理了,建议使用后台线程或者是干脆新建一个线程来运行,比如:

java代码:
Thread t =new Thread(new Runnable() {
public void run() {
//上面的代码
}
});
t.start();
HttpURLConnection使用Post的方式与后台交互,下载数据部分跟上一个示例是一样的,麻烦在于上传数据到服务器,需要进行设置和处理,如下:

java代码:
URL  u = new URL("http://192.168.0.100:8080/test.jsp");
conn = (HttpURLConnection)u.openConnection();
//因为这个是post请求,下面两个需要设置为true 
conn.setDoOutput(true); 
conn.setDoInput(true); 

java代码:
// 设置以POST方式 
conn.setRequestMethod("POST"); 
// Post 请求不能使用缓存 
conn.setUseCaches(false); 
conn.setInstanceFollowRedirects(true); 
// 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的 
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); 
//DataOutputStream流 
DataOutputStream ut = new DataOutputStream(conn.getOutputStream()); 
//要上传的参数 
String content = "uuid=" + URLEncoder.encode("post测试", "utf-8"); 
//将要上传的内容写入流中 
out.writeBytes(content);  
//刷新、关闭 
out.flush(); 
out.close();
使用Apache的Http操作包来实现以Get的方式与后台交互,示例如下:

java代码:
//封装用于请求的 方法 对象
HttpGet get = new HttpGet("http://192.168.0.100:8080/test.jsp?uuid=uuid121&name=name222");
//创建一个Http的客户端对象
HttpClient client = new DefaultHttpClient();
try{ //发送请求,并获得返回对象
HttpResponse response = client.execute(get);
//从response对象里面把返回值取出来
HttpEntity entity = response.getEntity();
//得到返回内容的流,接下来就是流式操作了
InputStream in = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuffer buffer = new StringBuffer();
String tempStr = "";
while((tempStr=reader.readLine())!=null){
buffer.append(tempStr);
}
in.close();//应该写finally里面去
reader.close();//应该写finally里面去
Log.i("javass",buffer.toString());
}catch(Exception err){err.printStackTrace();}
 
使用Apache的Http操作包来实现以Post的方式与后台交互,示例如下:

java代码:
//封装用于请求的 方法 对象
HttpPost post = new HttpPost("http://192.168.0.100:8080/test.jsp");
//为post组织参数
NameValuePair uuid = new BasicNameValuePair("uuid","postUuid");
NameValuePair name = new BasicNameValuePair("name","postname");
List list = new ArrayList();
list.add(uuid);
list.add(name);
//把这些参数封装到HttpEntity中
HttpEntity reqEntity = null;
reqEntity = new UrlEncodedFormEntity(list);
//然后把HttpEntity设置到post对象里面去
post.setEntity(reqEntity);
 
//创建一个Http的客户端对象
HttpClient client = new DefaultHttpClient();
//发送请求,并获得返回对象
HttpResponse response = client.execute(post);
后面获取response的Entity等的处理,跟get方式是完全一样的,这里就不去赘述了。

操作JSON

在实际应用开发中,网络间传输的数据经常是JSON格式的,除非十分有必要,不会去使用XML。因此必须要掌握Android如何处理JSON数据,Android已经自带了JSON的处理包“org.json”。下面就来看看如何解析已经获取的数据,获取数据的过程就是前面讲的获取的网络返回值。
返回单个对象的情况,示例如下:

java代码:
JSONObject j = new JSONObject(jsonData);
String uuid = j.getString(“uuid");
返回对象数组的情况,示例如下:

java代码:
JSONArray ja = new JSONArray(jsonData);
for(int i=0;i
视频配套PPT,视频地址【  Android4开发入门经典独家视频课程

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26715458/viewspace-717435/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26715458/viewspace-717435/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值