数据netstat命令详解

netstat命令详解  时间:2021-04-05  阅读:()
Android物联网应用程序开发机械工业出版社主编焦战王新强副主编崔鹏于智丁倩朱正月参编葛鹏张星江健朱天宝邹梓秀本书以全国职业院校技能大赛物联网应用技术赛项智慧城市项目为依托,以Android技术知识体系为依据,将项目拆分细化为教学项目展现给读者,让读者学习国赛智慧城市项目中的Android应用程序开发的系统知识.
本书共分一个岗前准备、八个项目单元、一个拓展单元.
分别是:岗前准备智慧城市项目概述、单元1Android开发环境搭建、单元2智慧城市界面的实现、单元3页面跳转的实现、单元4数据存储的实现、单元5设备接口调用的实现、单元6界面数据更新的实现、单元7媒体动画的实现、单元8数据传输的实现、拓展单元程序调试.
本书主要面向高职高专计算机电子信息类专业"Android物联网应用程序开发"课程教学使用,也可供爱好编程的社会人员学习物联网硬件编程.
图书在版编目(CIP)数据/主编.
—北京:机械工业出版社,2015.
7中等职业学校以工作过程为导向课程改革实验项目.
计算机网络技术专业核心课程系列教材ISBN978-7-111-50833-5Ⅰ.
①服…Ⅱ.
①韩…②王…Ⅲ.
①网络服务器—配置—中等专业学校—教材Ⅳ.
①TP368.
5中国版本图书馆CIP数据核字(2015)第154699号机械工业出版社(北京市百万庄大街22号邮政编码100037)策划编辑:责任编辑:版式设计:责任校对:封面设计:责任印制:印刷厂印刷年月第版第次印刷184mm*260mm·印张·千字0001—册标准书号:ISBN978-7-111--定价:.
元凡购本书,如有缺页、倒页、脱页,由本社发行部调换电话服务网络服务服务咨询热线:010-88379833机工官网:www.
cmpbook.
com机工官博:weibo.
com/cmp1952教育服务网:www.
cmpedu.
com封面无防伪标均为盗版金书网:www.
golden-book.
com读者购书热线:010-88379649—·III·—最近几年,物联网得到广泛的关注和应用,在人们生活中扮演着十分重要的角色,而伴随着物联网便携式移动设备的应用,Android已经成为最主要的移动开发平台系统之一,因为物联网的应用很广,有农业、交通、物流、医疗、商业等,而设备特性差异巨大,任何硬件都可以通过Android软件进行反馈与控制.
本书以2015年全国职业院校技能大赛物联网应用技术赛项智慧城市项目为基础,将大赛项目拆分为小的项目单元,由易到难排列,最终以Android技术知识点为教学项目的形式展现给读者,让读者读完本书后,就对国赛的智慧城市项目中的Android应用程序开发有了系统的了解和学习.
本书共分一个岗前准备和八个项目单元.
分别是:岗前准备智慧城市项目概述、单元1Android开发环境搭建、单元2智慧城市界面的实现、单元3页面跳转的实现、单元4数据存储的实现、单元5设备接口调用的实现、单元6界面数据更新的实现、单元7媒体动画的实现、单元8数据传输的实现.
书中的每个单元按照Android知识体系,循序渐进地铺开.
读者阅读顺序合理,但也可以跳过已经理解的章节内容,每个章节的代码都可以配套光盘中找到.
无论如何,请理解本书的目标:通过实际项目来学习掌握Android编程精髓,学习Android与硬件交互编程核心技能,如果你认真研读每一单元的内容,你将学到很多的国赛竞赛核心技能的应用.
本书主要面向高职高专计算机电子信息类专业"Android物联网应用程序开发"课程教学使用,也可供爱好编程的社会人员参考学习.
学习本书时,建议你使用物联网智慧城市实训系统.
尽管本书大部分的内容可以通过使用一台电脑和Android模拟器来学习,但有些事情只能在真正的设备上才能验证完成.
本书由焦战、王新强、崔鹏、于智、丁倩、朱正月共同编写,焦战负责全面内容规划、编排,由焦战、邹祉秀共同审定.
本书中的项目实践案例选择新大陆杯全国职业院校技能大赛物联网应用技术赛项智慧城市项目,在此对公司表示感谢.
在本书的编写过程中,编者尽可能做到把智慧城市所用到Android的相关知识、技能,将最新、最准确的信息传递给读者.
由于时间仓促、书中难免存在错误和不足之处,欢迎读者批评指正.
编者2016年1月1日—·IV·—岗前准备(1)【项目概述】(1)【项目需求分析】(2)【项目实施方案】(2)【项目功能设计】(3)【项目学习方法】(4)【项目考核方法】(4)单元1Android开发环境搭建(5)任务1Android系统环境搭建(6)任务目标(6)知识准备(6)任务2Android模拟器的配置(18)任务目标(18)知识准备(18)任务实现(23)单元2智慧城市界面的实现(27)任务1环境状态值范围设置界面开发(28)任务目标(28)知识准备(28)任务实现(30)任务2购物信息的存储界面开发(35)任务目标(36)知识准备(36)任务实现(37)任务3火焰监控界面开发(42)任务目标(42)知识准备(42)任务实现(43)任务4摄像头监控界面开发(46)任务目标(46)知识准备(46)任务实现(48)任务5用户注册界面开发(51)任务目标(51)知识准备(52)任务6购物查询购物信息界面开发(58)任务目标(58)知识准备(58)任务实现(59)任务7智慧城市主界面开发(66)任务目标(67)知识准备(67)任务实现(67)任务8农业大棚环境监控界面开发(71)任务实现(71)本章总结(74)单元3页面跳转的实现(75)任务1实现登录功能(76)任务目标(76)知识准备(76)任务实现(79)任务2主页面的生命周期(81)任务目标(81)知识准备(81)任务实现(83)任务3拍码购物功能中调用照相机的实现(86)任务目标(86)知识准备(86)任务实现(88)—·V·—本章小结(90)单元4数据存储的实现(91)任务1智能农业环境数据的设置(92)任务目标(92)知识准备(92)任务实现(94)任务2购物信息的录入(98)任务目标(98)知识准备(99)任务实现(101)任务3购物信息的查询(108)任务目标(109)知识准备(109)任务实现(113)任务4存储摄像头截图内容(120)任务目标(120)知识准备(120)任务实现(122)本章小结(126)单元5设备接口调用的实现(127)任务1传感器API的使用(128)任务目标(128)知识准备(128)任务实现(130)任务2摄像头API的使用(135)任务目标(136)知识准备(136)任务实现(137)任务3继电器API的使用(139)任务目标(140)知识准备(140)任务实现(140)本章小结(143)单元6界面数据更新的实现(145)任务1农业大棚中温湿度的实时显示(146)任务目标(146)知识准备(146)任务实现(148)任务2农业大棚中的风扇控制(152)任务目标(153)知识准备(153)任务实现(157)任务3农业大棚中的灯照控制(157)任务目标(157)知识准备(157)任务实现(159)本章小结(163)单元7媒体动画的实现(165)任务1声音警报功能的实现(166)任务目标(166)知识准备(167)任务实现(171)任务2购物二维码的识别(178)任务目标(178)知识准备(179)任务实现(185)任务3预警信息震动提示(194)任务目标(194)—·VI·—知识准备(195)任务实现(198)任务4通风风扇动画演示(202)任务目标(203)知识准备(203)任务实现(206)本章总结(213)单元8数据传输的实现(215)任务1火焰报警信息传递(216)任务目标(216)知识准备(217)任务实现(223)任务2终端远程控制摄像头(228)任务目标(229)知识准备(229)任务实现(235)任务3验证用户登录信息(235)任务目标(235)知识准备(236)任务实现(241)本章总结(244)拓展单元程序调试(245)任务1DDMS应用调试透视图(246)任务目标(246)知识准备(246)任务2异常与栈跟踪(252)任务目标(252)知识准备(252)任务3Android特有的调试工具(255)数据传输的实现单元8UNIT8Android开发中最重要的组成部分就是通过网络与服务器端的交互操作,以获取数据.
在Android中提供了丰富的网络连接功能,本书在本章介绍了Android中基本的网连接并结合实例实现与服务器端的连接与数据的传递.
掌握Android与Socket程序间的交互操作.
掌握webView组件与服务器端的交互掌握Android通过Http协议进行操作.
图8-1—·216·—任务1火焰报警信息传递任务目标理解TCP原理掌握AndroidSocket编程掌握Android中JSON的解析方法1.
运行Android客户端,界面效果显示如下.
实时读取火焰传感器的值,若发生火情,将火情信息发送到服务器端.
图8-22.
创建一个.
net程序,实现服务器端,运行之后显示效果如下,等待客户端连接,若客户端读取到发生火情,则将火焰信息传递服务器端并推送到LED屏中显示图8-3—·217·—知识准备1.
1TCP协议简介TCP是一种可靠的面向连接的传送服务.
它在传送数据时是分段进行的,主机交换数据必须建立一个会话.
它用比特流通信,即数据作为无结构的字节流.
通过每个TCP传输的字段指定顺序号,以获得可靠性.
TCP是使用IP的网间互联功能而提供可靠的数据传输,IP不停的把报文放到网络上,而TCP是负责确信报文到达.
在协同IP的操作中TCP负责:握手过程、报文管理、流量控制、错误检测和处理(控制).
一、TCP通过以下方式提供可靠性:应用程序分割为TCP认为最合适发送的数据块.
由TCP传递给IP的信息单位叫做报文段.
当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段.
如果不能即时收到一个确认,它就重发这个报文段.
当TCP收到发自TCP连接另一端的数据,它将发送一个确认.
这个确认不是立即发送,通常延迟几分之一秒.
TCP将保持它首部和数据的检验和.
这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化如果收到报文段的检验和有差错,TCP将丢弃这个报文段和不确认收到这个报文段.
既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能失序,因此TCP报文段的到达也可能失序.
如果必要,TCP将对收到的数据进行排序,将收到的数据以正确的顺序交给应用层.
既然IP数据报会发生重复,TCP连接端必须丢弃重复的数据.
TCP还能提供流量控制,TCP连接的每一方都有固定大小的缓冲空间.
TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据.
这将防止较快主机致使较慢主机的缓冲区溢出.
二、TCP首部:TCP数据被封装在一个IP数据报中,格式如下:TCP首部格式如下:IP首部20TCP首部20TCP首部TCP首部格式如下:—·218·—图8-4各个字段的含义如下:32位端口号:源端口和目的端口各占16位,2的16次方等于65536,看端口命令:netstat.
16位源端口号:源端口号是指发送数据的源主机的端口号,16位的源端口中包含初始化通信的端口.
源端口和源IP地址的作用是标识报文的返回地址.
16位目的端口号:目的端口号是指接收数据的目的主机的端口号,16位的目的端口域定义传输的目的地.
这个端口指明报文接收计算机上的应用程序地址端口.
32位序号:也称为顺序号(SequenceNumber),简称为SEQ),TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号.
整个要传送的字节流的起始序号必须在连接建立时设置.
首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号.
4位数据偏移:指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,整个字段实际上指明了TCP报文段的首部长度.
保留(6位):为了将来定义新的用途而保留的位,但目前应置为0.
(1)每个TCP段都包括源端和目的端的端口号,用于寻找发送端和接收端的应用进程.
这两个值加上IP首部的源端IP地址和目的端IP地址唯一确定一个TCP连接.
(2)序号用来标识从TCP发送端向接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节.
如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数.
(3)当建立一个新连接时,SYN标志变1.
序号字段包含由这个主机选择的该连接的初始序号ISN,该主机要发送数据的第一个字节的序号为这个ISN加1,因为SYN标志使用了一个序号.
(4)既然每个被传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一—·219·—个序号.
因此,确认序号应当是上次已成功收到数据字节序号加1.
只有ACK标志为1时确认序号字段才有效.
(5)发送ACK无需任何代价,因为32位的确认序号字段和ACK标志一样,总是TCP首部的一部分.
因此一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1.
(6)TCP为应用层提供全双工的服务.
因此,连接的每一端必须保持每个方向上的传输数据序号.
(7)TCP可以表述为一个没有选择确认或否认的滑动窗口协议.
因此TCP首部中的确认序号表示发送方已成功收到字节,但还不包含确认序号所指的字节.
当前还无法对数据流中选定的部分进行确认.
(8)首部长度需要设置,因为任选字段的长度是可变的.
TCP首部最多60个字节.
(9)6个标志位中的多个可同时设置为1URG-紧急指针有效ACK-确认序号有效PSH-接收方应尽快将这个报文段交给应用层RST-重建连接SYN-同步序号用来发起一个连接FIN-发送端完成发送任务(10)TCP的流量控制由连接的每一端通过声明的窗口大小来提供.
窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端期望接收的字节数.
窗口大小是一个16位的字段,因而窗口大小最大为65535字节.
(11)检验和覆盖整个TCP报文端:TCP首部和TCP数据.
这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证.
TCP检验和的计算和UDP首部检验和的计算一样,也使用伪首部.
(12)紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号.
TCP的紧急方式是发送端向另一端发送紧急数据的一种方式.
(13)最常见的可选字段是最长报文大小MMS,每个连接方通常都在通信的第一个报文段中指明这个选项.
它指明本端所能接收的最大长度的报文段.
TCP连接的建立需要通过三次握手才行,而且它的传输是可靠的,为什么呢因为它传输的数据能够毫无差错的到达客户端,因为在物理层传输的时候,是0101010二进制bit流进行传输的,所以通过外部因素可能会导致其中的数据改变,但是因为有数据链路层,保证了数—·220·—据的透明传输,通过冗余码的检测,会将不对的包丢弃,当数据包不对或者长时间没有收到数据包的话,就会请求服务端进行重传,而且数据包不是一次性全部传输的,是几个包传输,而包的大小也是有MTU(最大传输单元)来决定的,然后客户端接收到了之后保证这些包的数据没错而且按顺序到达了客户端才会进行下一批数据的传输.
所以这样就会保证数据的可靠传输,而不会丢失或者包错位了.
TCP为了保证不发生丢包,就给每个字节一个序号,同时序号也保证了传送到服务端的包的按序接收.
然后客户端对已成功收到的字节发回一个相应的确认(ACK);如果客户端在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传.
TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算和校验.
三.
TCP的三次握手与四次挥手1.
建立连接协议(三次握手)(1)客户端发送一个带SYN标志的TCP报文到服务器.
这是三次握手过程中的报文1.
(2)服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志.
因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯.
(3)客户必须再次回应服务段一个ACK报文,这是报文段3.
2.
连接终止协议(四次挥手)由于TCP连接是全双工的,因此每个方向都必须单独进行关闭.
这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接.
收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据.
首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭.
(1)TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4).
(2)服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5).
和SYN一样,一个FIN将占用一个序号.
(3)服务器关闭客户端的连接,发送一个FIN给客户端(报文段6).
(4)客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7).
四.
JAVA如何实现TCP协议1.
TCP/IP通信协议通过两端各建立一个Socket,从而在通信两端形成虚拟链路实现虚拟链路间的通信.
2.
Java对基于TCP协议的网络通信提供了良好的包装,Java使用Socket对象来代表两端的通信接口,并通过Socket产生I/O流来进行网络通信.
通信过程如图1-1所示.
—·221·—通信实体1虚拟链路通信实体2Socket1Socket2IO操作IO操作图8-51.
2Socket编程Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.
两者的最大差异在于,http连接使用的是"请求—响应方式",即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.
而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求.
那么,什么是socketSocket又称套接字,在程序内部提供了与外界通信的端口,即端口通信.
通过建立socket连接,可为通信双方的数据传输提供通道.
socket的主要特点有数据丢失率低,使用简单且易于移植.
一、什么是Socket是一种抽象层,应用程序通过它来发送和接收数据,使用Socket可以将应用程序添加到网络中,与处于同一网络中的其他应用程序进行通信.
简单来说,Socket提供了程序内部与外界通信的端口并为通信双方的提供了数据传输通道.
二、Socket的分类根据不同的的底层协议,Socket的实现是多样化的.
本书中只介绍TCP/IP协议族的内容,在这个协议族当中主要的Socket类型为流套接字(streamsocket)和数据报套接字(datagramsocket).
流套接字将TCP作为其端对端协议,提供了一个可信赖的字节流服务.
数据报套接字使用UDP协议,提供数据打包发送服务.
三、Socket基本实现原理1.
基于TCP协议的Socket服务器端首先声明一个ServerSocket对象并且指定端口号,然后调用Serversocket的accept()方法接收客户端的数据.
accept()方法在没有数据进行接收的处于堵塞状态.
(Socketsocket=serversocket.
accept()),一旦接收到数据,通过inputstream读取接收的数据.
客户端创建一个Socket对象,指定服务器端的ip地址和端口号(Socketsocket=newSo—·222·—cket("172.
168.
10.
108",8080);),通过inputstream读取数据,获取服务器发出的数据(OutputStreamoutputstream=socket.
getOutputStream()),最后将要发送的数据写入到outputstream即可进行TCP协议的socket数据传输.
2.
基于UDP协议的数据传输服务器端首先创建一个DatagramSocket对象,并且指点监听的端口.
接下来创建一个空的DatagramSocket对象用于接收数据(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.
length)),使用DatagramSocket的receive方法接收客户端发送的数据,receive()与serversocket的accepet()类似,在没有数据进行接收的处于堵塞状态.
客户端也创建个DatagramSocket对象,并且指点监听的端口.
接下来创建一个InetAddress对象,这个对象类似与一个网络的发送地址(InetAddressserveraddress=InetAddress.
getByName("172.
168.
1.
120")).
定义要发送的一个字符串,创建一个DatagramPacket对象,并制定要讲这个数据报包发送到网络的那个地址以及端口号,最后使用DatagramSocket的对象的send()发送数据.
*(Stringstr="hello";bytedata[]=str.
getByte();DatagramPacketpacket=newDatagramPacket(data,data.
length,serveraddress,4567);socket.
send(packet);)四、编写Socket程序的一般步骤1.
创建服务器ServerSocket,设置建立连接的port.
2.
创建客户机Socket,设置绑定的主机名称或IP地址,指定链接端口号.
3.
客户机Socket发送连接请求.
4.
建立链接(accept),返回Socket对象这个维护了2个流输入和输出流借助这两个流和客户端通信.
5.
取得InputStream和OutputStream.
6.
利用InputStream和OutputStream进行数据通信.
五、Socket连接模型服务器ServerSocket(端口#)ServerSocket.
accept()客户机Socket(主机,端口#)(试图连接)OutputStreamInputStreamOutputStreamInputStreamSocket()Socket.
close()Socket.
close()图8-6—·223·—任务实现第一步:在Eclipse中创建一个Android工程,命名为AndroidDemo8_1.
并把单元2任务3的界面导入到此项目中图8-7第二步:在src文件夹中下建立BasePort.
java文件实现打开和关闭串口功能.
packagecom.
example.
androiddemo8_1;importcom.
example.
analoglib.
Analog4150ServiceAPI;publicclassBasePort{/***打开ADAM4150串口*@paramcom串口号如COM0COM1COM2*@parammode区分是USB串口还是COM串口,0表示COM,1表示USB,2表示是低频与超高频*@parambaudRate(0-9)波特率0=12001=24002=48003=96004=192005=384006=576007=1152008=2304009=921600*@return串口句炳*/publicintopenADAMPort(intcom,intmode,intbaudRate){returnAnalog4150ServiceAPI.
openPort(com,mode,baudRate);}/**—·224·—*关闭ADAM4150串口*/publicvoidcloseADAMPort(){Analog4150ServiceAPI.
closeUart();}}第三步:同样在src文件夹中新建类ADAM4150.
java继承自我们自定义的BasePort类,定义开关风扇的命令.
publicclassADAM4150extendsBasePort{//定义开关风扇命令,这些命令是协议里有的,如果需要了解详细解析请浏览协议文档privatefinalchar[]open1Fen={0x01,0x05,0x00,0x10,0xFF,0x00,0x8D,0xFF};privatefinalchar[]close1Fen={0x01,0x05,0x00,0x10,0x00,0x00,0xCC,0x0F};privatefinalchar[]open2Fen={0x01,0x05,0x00,0x11,0xFF,0x00,0xDC,0x3F};privatefinalchar[]close2Fen={0x01,0x05,0x00,0x11,0x00,0x00,0x9D,0xCF};第四步:创建ADAM4150类的构造方法,并实现对人体传感器与火焰传感器的实时取值,并用get方法返回.
publicstaticintmADAM4150_fd=0;privateStringrePerson;privatebooleanreFire;publicADAM4150(intcom,intmode,intbaudRate){//打开串口mADAM4150_fd=openADAMPort(com,mode,baudRate);ReceiveThreadmReceiveThread=newReceiveThread();mReceiveThread.
start();//设置人体回调函数,人体传感器接入DI0Analog4150ServiceAPI.
getPerson("person",newOnPersonResponse(){@OverridepublicvoidonValue(Stringarg0){rePerson=arg0;}@OverridepublicvoidonValue(booleanarg0){}});//人体接入00火焰接入DO1烟雾接入DO2Analog4150ServiceAPI.
getFire("fire",newOnFireResponse(){@OverridepublicvoidonValue(Stringarg0){}@Override—·225·—publicvoidonValue(booleanarg0){reFire=arg0;}});}/***获取人体*@return人体值true为有人false为无人*/publicStringgetPerson(){returnrePerson;}/***获取火焰*@return火焰值true为有火false为无火*/publicbooleangetFire(){returnreFire;}}第五步:实现打开与关闭风扇功能.
//打开1风扇publicvoidopenFan1(){Analog4150ServiceAPI.
sendRelayControl(open1Fen);}//打开2风扇publicvoidopenFan2(){Analog4150ServiceAPI.
sendRelayControl(open2Fen);}//关闭1风扇publicvoidcloseFan1(){Analog4150ServiceAPI.
sendRelayControl(close1Fen);}//关闭2风扇publicvoidcloseFan2(){Analog4150ServiceAPI.
sendRelayControl(close2Fen);}第六步:新建MySocket类继承自Thread类完成其构造方法实现Socket连接.
publicclassMySocketextendsThread{privateSocketmSocket=null;—·226·—privateOutputStreammOutStream;privateStringmSocket_Ip="";//Socket服务器IpprivateintmSocket_Port=0;//Socket服务器端口publicstaticbooleanisRun=true;publicStringsendMsg="";publicMySocket(StringmSocket_Ip,intmSocket_Port,StringsendMsg){super();this.
mSocket_Ip=mSocket_Ip;this.
mSocket_Port=mSocket_Port;this.
sendMsg=sendMsg;try{try{//每两秒发送一次Thread.
sleep(2000);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.
printStackTrace();}//实例化Socket对象mSocket=newSocket(mSocket_Ip,mSocket_Port);//设置超时时间mSocket.
setSoTimeout(5000);isRun=true;}catch(UnknownHostExceptione){//TODOAuto-generatedcatchblockisRun=false;e.
printStackTrace();}catch(IOExceptione){//TODOAuto-generatedcatchblockisRun=false;e.
printStackTrace();}}第七步:重写Thread类中的run方法用来获取输出流发送信息.
并自定义closeSocket方法关闭socket连接@Overridepublicvoidrun(){super.
run();while(isRun){try{—·227·—//获取输出流mOutStream=mSocket.
getOutputStream();//Stringsend=URLEncoder.
encode(sendMsg,"uf8");mOutStream.
write(sendMsg.
getBytes("UTF-8"),0,sendMsg.
getBytes().
length);}catch(IOExceptione){//TODOAuto-generatedcatchblocke.
printStackTrace();}}}publicvoidcloseSocket(){try{isRun=false;mSocket.
close();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.
printStackTrace();}}第八步:在MainActivity中使用initView方法对控件初始化并重写Activity中的onDestroy()方法用来实现关闭串口与socket通信.
privatevoidinitView(){mTvPerson=(TextView)findViewById(R.
id.
tvPerson);mTvFiremTvFire=(TextView)findViewById(R.
id.
tvFire);}@OverrideprotectedvoidonDestroy(){//TODOAuto-generatedmethodstubsuper.
onDestroy();if(mAdam4150!
=null){mAdam4150.
closeADAMPort();}if(mSocket!
=null){mSocket.
closeSocket();}}第九步:在initView方法中new一个ADAM4150对象并使用Handler判断传感器的值更新界面并调用Socket线程.
privatevoidinitView(){—·228·—mAdam4150=newADAM4150(1,0,3);mHandler.
postDelayed(mRunnable,ms);}privateintms=300;//每300毫秒运行一次//声明一个Handler对象privateHandlermHandler=newHandler();//声明一个Runnable对象privateRunnablemRunnable=newRunnable(){@Overridepublicvoidrun(){//设置多少秒后执行mHandler.
postDelayed(mRunnable,ms);//如果为真则显示有人,反之显示无人mTvPerson.
setText(mAdam4150.
getPerson());mTvFire.
setText(mAdam4150.
getFire()"有火":"无火");//如果为真则设置火焰图片,反之隐藏火焰图片if(mAdam4150.
getFire()){//实例化MySocket传入Ip端口和将发送的信息mSocket.
isRun=true;if(mSocket!
=null)return;//Ip为socketserviceip端口一样mSocket=newMySocket("192.
168.
191.
1",8081,"Tocatchfire!
");mSocket.
start();}else{mSocket.
isRun=false;}}};第十步:在AndroidMainfest文件中声明联网允许第十一步:运行.
netDemo8_1_Socket_Service程序,并启动Android端,我们可以用打火机使火焰传感器读取到火焰,之后Android端通过socket通信将信息发送到.
net端,将火情信息"Tocatchfire!
"显示在.
net端.
任务2终端远程控制摄像头通过网络通信以及WebView组件时时读取远程摄像头所拍摄到的信息读取至服务器端.
—·229·—任务目标掌握Android中URL的基本知识掌握URL读取网络资源的方法掌握HTTP方式访问网络的方法掌握HttpURLConnection与HttpClient接口的用法掌握WebView组件的用法知识准备URL(UniformResourceLocator)对象代表统一资源定位器,它是指向互联网"资源"的指针.
资源可以是简单的文件或目录,也可以是对更复杂的对象的引用,例如对数据库或搜索引擎的查询.
通常情况而言,URL可以由协议名、主机、端口和资源组成.
格式:protocal://host:port/resourceName;例如:http://finance.
sina.
com.
cn:8080/zl/URL类提供了一些构造器用于创建URL对象,一旦获得URL对象之后,可以调用如下常用方法来访问这些URL对应的资源.
URL请求的类别分为二类,GET与POST请求.
二者的区别在于:get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet.
post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内.
1.
1HttpURLConnection接口HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序.
虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它.
在java.
net类中,HttpURLConnection类是一种访问HTTP资源的方式.
HttpURLConnection继承自URLConnection,可用于向指定网站发送GET请求、POST请求.
它在URLConnection的基础上提供了如下便捷的方法:intgetResponseCode():获取服务器的响应代码.
StringgetResponseMessage():获取服务器的响应消息.
StringgetResponseMethod():获取发送请求的方法.
voidsetRequestMethod(Stringmethod):设置发送请求的方法.
—·230·—在一般情况下,如果只是需要Web站点的某个简单页面提交请求并获取服务器响应,HttpURLConnection完全可以胜任.
但在绝大部分情况下,Web站点的网页可能没这么简单,这些页面并不是通过一个简单的URL就可访问的,可能需要用户登录而且具有相应的权限才可访问该页面.
在这种情况下,就需要涉及Session、Cookie的处理了,如果打算使用HttpURLConnection来处理这些细节,当然也是可能实现的,只是处理起来难度就大了.
HttpURLConnection的connect()函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求.
无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去.
http请求实际上由两部分组成,一个是http头,所有关于此次http请求的配置都在http头里面定义,一个是正文content.
connect()函数会根据HttpURLConnection对象的配置值生成http头部信息,因此在调用connect函数之前,就必须把所有的配置准备好.
HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现.
如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行.
可以通过以下两个语句来设置相应的超时:System.
setProperty("sun.
net.
client.
defaultConnectTimeout",超时毫秒数字符串);System.
setProperty("sun.
net.
client.
defaultReadTimeout",超时毫秒数字符串);其中:sun.
net.
client.
defaultConnectTimeout:连接主机的超时时间(单位:毫秒)sun.
net.
client.
defaultReadTimeout:从主机读取数据的超时时间(单位:毫秒)HttpURLConnection对象不能直接构造,需要通过URL.
openConnection()来获得HttpURLConnection对象,示例代码如下:StringszUrl="http://www.
ee2ee.
com/";URLurl=newURL(szUrl);HttpURLConnectionurlCon=(HttpURLConnection)url.
openConnection();1.
2HttpClient接口在Android中,使用http协议的编程工作是比较简单的,androidSDK中已经集成了Apache的HttpClient模块.
使用HttpClient可以快速开发出功能强大的Http程序.
不过一般说来,要开发与Internet连接的程序,最基础的还是使用HttpURLConnection.
为了更好地处理向Web站点请求,包括处理Session、Cookie等细节问题,Apache开源组织提供了一个HttpClient项目,看它的名称就知道,它是一个简单的HTTP客户端(并不是浏览器),可以用于发送HTTP请求,接收HTTP响应.
但不会缓存服务器的响应,不能执行HTML页面中嵌入的Javascript代码;也不会对页面内容进行任何解析、处理.
—·231·—简单来说,HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP连接.
使用HttpClient发送请求、接收响应很简单,只要如下几步即可.
1.
创建HttpClient对象.
2.
如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象.
3.
如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParamsparams)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntityentity)方法来设置请求参数.
4.
调用HttpClient对象的execute(HttpUriRequestrequest)发送请求,执行该方法返回一个HttpResponse.
5.
调用HttpResponse的getAllHeaders()、getHeaders(Stringname)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容.
程序可通过该对象获取服务器的响应内容.
在Android2.
2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择.
而在Android2.
3版本及以后,HttpURLConnection则是最佳的选择.
它的API简单,体积较小,因而非常适用于Android项目.
压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用.
对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中我们也会将更多的时间放在优化HttpURLConnection上面.
1.
3WebView组件的使用一、什么是WebkitAndroid手机中内置了一款高性能webkit内核浏览器,在SDK中装为一个叫做WebView组件.
WebKit是MacOSXv10.
3及以上版本所包含的软件框架(对v10.
2.
7及以上版本也可通过软件更新获取).
同时,WebKit也是MacOSX的Safari网页浏览器的基础.
WebKit是一个开源项目,主要由KDE的KHTML修改而来并且包含了一些来自苹果公司的一些组件.
二、什么是WebViewWebView可是个好东西,作用相当于一个迷你的浏览器,采用Webkit内核,因此完美支持html、javascript、css等.
有时,我们完全可以把UI甚至数据处理都交给WebView,配合PHP等服务端程序,这样Android开发就变成了网页开发,可以省很多精力.
—·232·—三、Android实现WebView方法1.
第一种方法(1)要在Activity中实例化WebView组件:WebViewwebView=newWebView(this).
(2)调用WebView的loadUrl()方法,设置WevView要显示的网页:互联网用:webView.
loadUrl("http://www.
android.
com");本地文件用:webView.
loadUrl("file://android_asset/XX.
html");本地文件存放在:assets文件中.
(3)调用Activity的setContentView()方法来显示网页视图.
(4)用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面.
(5)需要在AndroidManifest.
xml文件中添加权限,否则会出现Webpagenotavailable错误.
添加权限如下:2.
第二种方法(1)在布局文件中声明WebView.
(2)在Activity中实例化WebView.
(3)调用WebView的loadUrl()方法,设置WebView要显示的网页.
(4)为了让WebView能够响应超链接功能,调用setWebViewClient()方法,设置WebView视图.
(5)用WebView点链接看很多页以后为了让WebView支持回退功能,需要覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面.
(6)需要在AndroidManifest.
xml文件中添加权限,否则出现Webpagenotavailable错误.
四、常用属性、状态描述:WebSettings常用方法:—·233·—setAllowFileAccess启用或禁止WebView访问文件数据setBlockNetworkImage是否显示网络图像setBuiltInZoomControls设置是否支持缩放setCacheMode设置缓冲的模式setDefaultFontSize设置默认的字体大小setDefaultTextEncodingName设置在解码时使用的默认编码setFixedFontFamily设置固定使用的字体setJavaSciptEnabled设置是否支持JavascriptsetLayoutAlgorithm设置布局方式setLightTouchEnabled设置用鼠标激活被选项setSupportZoom设置是否支持变焦WebViewClient常用方法:doUpdateVisitedHistory更新历史记录onFormResubmission应用程序重新请求网页数据onLoadResource加载指定地址提供的资源onPageFinished网页加载完毕onPageStarted网页开始加载onReceivedError报告错误信息onScaleChangedWebView发生改变shouldOverrideUrlLoading控制新的连接在当前WebView中打开WebChromeClient常用方法:onCloseWindow关闭WebViewonCreateWindow创建WebViewonJsAlert处理Javascript中的Alert对话框onJsConfirm处理Javascript中的Confirm对话框onJsPrompt处理Javascript中的Prompt对话框onProgressChanged加载进度条改变—·234·—onReceivedlcon网页图标更改onReceivedTitle网页Title更改onRequestFocusWebView显示焦点五、AndroidwebView开发过程中相关知识1.
AndroidManifest.
xml中必须使用许可"android.
permission.
INTERNET",否则会出Webpagenotavailable错误.
2.
如果访问的页面中有Javascript,则webview必须设置支持Javascript.
webview.
getSettings().
setJavaScriptEnabled(true);3.
如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖webview的WebViewClient对象.
4.
下面的代码通过loadUrl方法设置当前webView需要访问的网址:mWebView=(WebView)findViewById(R.
id.
WebView01);mWebView.
loadUrl("http://www.
juapk.
com/thread-940-1-1.
html");5.
在android中专门通过WebSettings来设置WebView的一些属性.
状态等.
在创建WebView时,系统有一个默认的设置,我们可以通过WebView.
getSettings来得到这个设置:WebSettingswebSettings=mWebView.
getSettings();//取得对象WebSettings和WebView都在同一个生命周期中存在,当WebView被销毁后,如果再使用WebSettings,则会抛出异常.
6.
使用WebViewClient来完成在应用程序中自定义网页浏览程序:WebViewClient是辅助WebView处理各种通知.
请求等事件的类.
通过WebView的setWebViewClient方法指定WebViewClient对象.
WebView可以通过覆盖WebViewClient方法来辅助WebView浏览网页:publicBooleanshouldOverrideUrlLoading(WebViewview,Stringurl){view.
loadUrl(url);returntrue;}1.
4实时更新通过Http连接来读取网页,每隔5秒钟,程序自己刷新.
要实时的从网页获取数据,其实就是把获取网络数据的代码写到线程中,不停的进行更新.
需要说明一点:android中更新视图不能直接在线程中进行,所以这里需要使用handler来实现更新.
这里我们要不断的取得摄像头采集的视频流,然后通过网络发送到服务端.
—·235·—任务实现因例子在前面已经有过,这里就不赘述了.
图8-8任务3验证用户登录信息任务目标掌握Android中XML解析方法掌握Android中JSON解析方法创建一个Android工程,实现登录界面并将EditText控件中读取到的用户名密码进行封装并发送到服务器端进行验证.
Android端如图所示:图8-9—·236·—知识准备1.
1XML解析的使用XML(eXtensibleMarkupLanguage),即可扩展标记语言,是一种简单的数据存储语言,使用一系列简单的标记描述数据.
从它诞生到现在,已经得到了人们广泛的支持与应用.
因为它架起了复杂的标准通用标记语言(SGML)与功能有限的超文本标记语言(HTML)之间的桥梁.
所谓XML文件的解析是指:把代表XML文档的一个无结构的字符序列转换成满足XML语法的结构化组件的过程.
在Android手机中处理XML数据是很常见的事情,通常在不同平台传输数据的时候,我们就可能使用XML,XML是与平台无关的特性,被广泛运用于数据通信中,下面我们介绍在android中如何解析XML文件数据呢通常有三种方式:DOM、SAX、PULL.
一、DOM解析技术1.
DOM的工作原理使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并根据需要修改文档.
DOM实现时首先为XML文档的解析定义一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,这样代码就可以使用DOM接口来操作整个树结构.
2.
常用的DOM接口和类Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础.
Element:该接口继承Node接口,提供了获取、修改XML元素名字和属性的方法.
Node:该接口提供处理并获取节点和子节点值的方法.
NodeList:提供获得节点个数和当前节点的方法.
这样就可以迭代地访问各个节点.
DOMParser:该类是Apache的Xerces中的DOM解析器类,可直接解析XML文件.
3.
DOM的解析流程对上述给出的XML文件的处理过程如下图1-2所示.
—·237·—XML文件ItemDataIdID商品名称商品URLProductNameProductUrlItem图8-10二、SAX解析技术SAX(SimpleAPIforXML)是XML简单应用程序接口,是一个公共的基于事件的XML文档解析标准.
它以事件作为解析XML文件的模式,它将XML文件转化成一系列的事件,由不同的事件处理器来决定如何处理.
1.
SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束.
SAX是采用事件驱动,就是说他不需要完全读完xml文件,他是读到一个节点就解析一个节点是否符合xml语法,如果符合就调用相对应的方法其实就是回调方法,并且没有记忆功能.
2.
常用的SAX接口和类Attrbutes:用于得到属性的个数、名字和值.
ContentHandler:定义与文档本身关联的事件(例如,开始和结束标记).
大多数应用程序都注册这些事件.
DTDHandler:定义与DTD关联的事件.
它没有定义足够的事件来完整地报告DTD.
如果需要对DTD进行语法分析,请使用可选的DeclHandler.
DeclHandler是SAX的扩展.
不是所有的语法分析器都支持它.
EntityResolver:定义与装入实体关联的事件.
只有少数几个应用程序注册这些事件.
ErrorHandler:定义错误事件.
许多应用程序注册这些事件以便用它们自己的方式报错.
DefaultHandler:它提供了这些接口的缺省实现.
在大多数情况下,为应用程序扩展DefaultHandler并覆盖相关的方法要比直接实现一个接口更容易.
3.
SAX的解析流程对上述给出的XML文件的处理过程如下图1-3所示.
—·238·—startDocumentstartElementIDcharactersendElementendDocument图8-11三、PULL解析技术Android并未提供对JavaStAXAPI的支持.
但是,Android附带了一个pull解析器,其工作方式类似于StAX.
它允许用户的应用程序代码从解析器中获取事件,这与SAX解析器自动将事件推入处理程序相反.
1.
PULL的工作原理PULL提供了开始元素和结束元素.
当某个元素开始时,我们可以调用parser.
nextText()从XML文档中提取所有字符数据.
当解释到一个文档结束时,自动生成EndDocument事件.
2.
常用的PULL的接口和类XmlPullParser:XMLpull解析器是一个在XMLPULLV1API中提供了定义解析功能的接口.
XmlSerializer:它是一个接口,定义了XML信息集的序列.
XmlPullParserFactory:这个类用于在XMPULLV1API中创建XMLPull解析器.
XmlPullParserException:抛出单一的XMLpull解析器相关的错误.
3.
PULL的解析流程对上述给出的XML文件的处理过程如下图1-4所示—·239·—start_documentend_documentstart_tagend_tag图8-12四.
这几种解析技术的比较对于Android的移动设备而言,因为设备的资源比较宝贵,内存是有限的,所以我们需要选择适合的技术来解析XML,这样有利于提高访问的速度.
(1)DOM在处理XML文件时,将XML文件解析成树状结构并放入内存中进行处理.
当XML文件较小时,我们可以选DOM,因为它简单、直观.
(2)SAX则是以事件作为解析XML文件的模式,它将XML文件转化成一系列的事件,由不同的事件处理器来决定如何处理.
XML文件较大时,选择SAX技术是比较合理的.
虽然代码量有些大,但是它不需要将所有的XML文件加载到内存中.
这样对于有限的Android内存更有效,而且Android提供了一种传统的SAX使用方法以及一个便捷的SAX包装器.
使用Android.
util.
Xml类,从示例中可以看出,会比使用SAX来得简单.
(3)PULL解析并未像SAX解析那样监听元素的结束,而是在开始处完成了大部分处理.
这有利于提早读取XML文件,可以极大的减少解析时间,这种优化对于连接速度较慢的移动设备而言尤为重要.
对于XML文档较大但只需要文档的一部分时,PULL解析器则是更为有效的方法.
1.
2JSON解析的使用一、JSON(JavaScriptObjectNotation)的定义一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.
业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.
JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为.
—·240·—二、在Android中包含四个与JSON相关的类和一个Exceptions:1.
JSONObject:这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值.
它对外部(External:应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{"JSON":"Hello,World"},最外被大括号包裹,其中的Key和Value被冒号":"分隔).
其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:newJSONObject().
put("JSON","Hello,World!
"),在Key和Value之间是以逗号","分隔.
Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.
NULLobject.
有两个不同的取值方法:get():在确定数值存在的条件下使用,否则当无法检索到相关Key时,将会抛出一个Exception信息.
opt():这个方法相对比较灵活,当无法获取所指定数值时,将会返回一个默认数值,并不会抛出异常.
2.
JSONArray:它代表一组有序的数值.
将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号","分隔(例如:[value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式).
这个类的内部同样具有查询行为,get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值.
同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.
NULLobject.
3.
JSONStringer:根据官方的解释,这个类可以帮助快速和便捷的创建JSONtext.
其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntaxrules)创建JSONtext.
每个JSONStringer实体只能对应创建一个JSONtext.
根据下边的实例来了解其它相关信息:viewplainStringmyString=newJSONStringer().
object().
key("name").
value("小猪").
endObject().
toString();—·241·—结果是一组标准格式的JSONtext:{"name":"小猪"}其中的.
object()和.
endObject()必须同时使用,是为了按照Object标准给数值添加边界.
同样,针对数组也有一组标准的方法来生成边界.
array()和.
endArray().
4.
JSONTokener:这个是系统为JSONObject和JSONArray构造器解析JSONsourcestring的类,它可以从sourcestring中提取数值信息.
5.
JSONException:是JSON.
org类抛出的异常信息.
三、JSONVsXML1.
JSON和XML的数据可读性基本相同2.
JSON和XML同样拥有丰富的解析手段3.
JSON相对于XML来讲,数据的体积小4.
JSON与JavaScript的交互更加方便5.
JSON对数据的描述性比XML较差6.
JSON的速度要远远快于XML任务实现第一步:在Eclipse中新建Android项目AndroidDemo8_3.
并将单元2任务8做好的界面导入到本项目中,作为本项目登录之后的界面.
第二步:新建名为activity_login.
xml.
文件,结合单元2的知识制作登录界面:图8-13—·242·—第三步:在src文件夹中新建LoginActivity.
java文件,并自定义initView方法实现控件的初始化,定义名为uri的string字符串存放服务器端地址.
publicclassLoginActivityextendsActivity{privateButtonmBtnLogin;//登陆按钮privateEditTextmEtUserId,mEtPassword;//账号密码编辑框publicStringuri="http://192.
168.
191.
1:80/index.
ashx";//WebService地址@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.
onCreate(savedInstanceState);setContentView(R.
layout.
activity_login);initView();}privatevoidinitView(){mBtnLogin=(Button)findViewById(R.
id.
btnLogin);mEtUserId=(EditText)findViewById(R.
id.
etUserId);mEtPassword=(EditText)findViewById(R.
id.
etPassWord);}第四步:自定义LoginThread类继承Thread类,并对用户名密码进行封装.
publicclassLoginThreadextendsThread{privateStringUserName;//将要请求的用户名privateStringUserPwd;//讲要请求的密码publicLoginThread(StringUserName,StringUserPwd){this.
UserName=UserName;this.
UserPwd=UserPwd;}@Overridepublicvoidrun(){//TODOAuto-generatedmethodstubsuper.
run();HttpPostre=newHttpPost(uri);try{//该Json对象为:{"OP":"Login","Context":{"UserName":"admin","UserPwd":"admin"}}//声明Json对象JSONObjectdata=newJSONObject();//在Json对象中添加OP节点data.
put("OP","Login");JSONObjectcontext=newJSONObject();—·243·—//添加context对象context.
put("UserName",UserName);context.
put("UserPwd",UserPwd);data.
put("Context",context);//将Json数据放入StringEntity中StringEntityentity=newStringEntity(data.
toString());//设置内容类型entity.
setContentType("application/json");//设置传入实体re.
setEntity(entity);第六步:在此run方法中把已经封装好的数据通过HTTP发送到服务器端,并将返回的结果通过Message对象发送.
HttpResponsehttpResponse=newDefaultHttpClient().
execute(re);StringreString=EntityUtils.
toString(httpResponse.
getEntity());//将返回字符串转换成Json对象JSONObjectreJson=newJSONObject(reString);booleanisSuccess=reJson.
getBoolean("IsSuccess");//发送服务器返回结果Messagemsg=newMessage();msg.
obj=isSuccess;//通过handler传给主线程mHandler.
sendMessage(msg);第七步:使用Handler接受Message对象,并判断如果返回值为true进行页面跳转,如果返回值为fasle提示登录失败.
HandlermHandler=newHandler(){publicvoidhandleMessage(Messagemsg){booleanisSuccess=(Boolean)msg.
obj;//对返回结果进行判断if(isSuccess){//登陆成功跳转页面Intentintent=newIntent(LoginActivity.
this,MainActivity.
class);startActivity(intent);}else{Toast.
makeText(getApplicationContext(),"账号密码错误",Toast.
LENGTH_SHORT).
show();}};};—·244·—第八步:在AndroidMainfest文件中声明联网允许第九步:将webService发布到IIS服务器上后运行Android程序进行登录验证.
本章总结在本章中主要介绍了TCP/ip通信方法HTTP连接json、xml格式的封装等.
这些都是Android网络开发与服务器进行信息交流通讯的必备技能.

10gbiz:香港/洛杉矶CN2直连线路VPS四折优惠,直连香港/香港/洛杉矶CN2四折

10gbiz怎么样?10gbiz在本站也多次分享过,是一家成立于2020的国人主机商家,主要销售VPS和独立服务器,机房目前有中国香港和美国洛杉矶、硅谷等地,线路都非常不错,香港为三网直连,电信走CN2,洛杉矶线路为三网回程CN2 GIA,10gbiz商家七月连续推出各种优惠活动,除了延续之前的VPS产品4折优惠,目前增加了美国硅谷独立服务器首月半价的活动,有需要的朋友可以看看。10gbiz优惠码...

老用户专享福利 腾讯云 免费领取轻量云2核4G服务器一年

感恩一年有你!免费领取2核4G套餐!2核4G轻量应用服务器2核 CPU 4GB内存 60G SSD云硬盘 6Mbps带宽领取地址:https://cloud.tencent.com/act/pro/lighthousethankyou活动规则活动时间2021年9月23日 ~ 2021年10月23日活动对象腾讯云官网已注册且完成实名认证的国内站用户(协作者与子用户账号除外),且符合以下活动条件:账号...

Vultr再次发布充值多少送多少活动

昨天我们很多小伙伴们应该都有看到,包括有隔壁的一些博主们都有发布Vultr商家新的新用户注册福利活动。以前是有赠送100美元有效期30天的,这次改成有效期14天。早年才开始的时候有效期是60天的,这个是商家行为,主要还是吸引到我们后续的充值使用,毕竟他们的体验金赠送,在同类商家中算是比较大方的。昨天活动内容:重新调整Vultr新注册用户赠送100美元奖励金有效期14天今天早上群里的朋友告诉我,两年...

netstat命令详解为你推荐
openeuleropen opening opens opened有什么区别www.5any.comwww.qbo5.com 这个网站要安装播放器www.se222se.com原来的www站到底222eee怎么了莫非不是不能222eee在收视com了,/?求解33tutu.com33gan.com改成什么了本冈一郎本冈一郎的官网说是日本相扑用的,我们平常的人增肥可以吗?铂金血痕花开易见落难寻,阶前愁杀葬花人;独把花锄偷洒泪,洒上空枝见血痕。是什么意思蜘蛛机器人红警2里的蜘蛛机器人怎样对负莱姿蔓莎琳蒂蔓的护肤怎么样呢?云鹏清身患哮喘疾病时间较长,怎样才能治好www.niuniu.com哪里有免费牛牛游戏可以玩啊
广州服务器租用 租服务器价格 域名抢注工具 美国主机排名 联通c套餐 yardvps ion vultr美国与日本 流媒体服务器 宕机监控 淘宝双十一2018 最好看的qq空间 灵动鬼影 百兆独享 tna官网 服务器合租 个人免费主页 360云服务 防cc攻击 阿里云邮箱登陆 更多