手机作为一种通讯终端(MMS),伴随着网络的升级而不断的升级换代。
1995年1G问世,手机只能进行基本的语音通讯,1996-1997年2G(GSM,CDMA)及其后的GPRS,EDGE等技术的快速发展,手机开始逐渐增加了数据服务功能。
2009年开始,3G在全世界开始大规模布置以及苹果创造性开发新型苹果手机。
手机慢慢的变成互联网的终端,从而带动了一个新的时代--移动互联网时代。
因此现代手机通常都支持这些常用网络设备,如WIFI,NFC,蓝牙等。
Android是由互联网巨头Google带头开发的,因此对网络功能的支持是必不可少的。
Google 的应用层采用的是Java语言。
所以JAVA支持的网络编程方式Android都支持,同时Google 还引入了Apache 的HTTP扩展包。
另外,针对WIFI,NFC,分别提供的单独的开发API.表1展示了Android SDK中的一些与网络有关的API包名表1. Android SDK 网络包包描述 API Level 提供与联网有关的类,包括流和数据包(datagram)sockets、Internet 协议和常见HTTP 处理。
该包是一个多功能网络资源。
有经验的Java 开发人员可以立即使用这个熟悉的包创建应用程序。
1java.io 虽然没有提供显式的联网功能,但是仍然非常重要。
该包中的类由其他Java 包中提供的socket 和连接使用。
它们还用于与本地文件(在与网络进行交互时会经常出现)的交互 1java.nio 包含表示特定数据类型的缓冲区的类。
适合用于两个基于Java 语言的端点之间的通信。
1org.apache.* 表示许多为HTTP 通信提供精确控制和功能的包。
可以将Apache 视为流行的开源Web 服务器。
1 除核心.* 类以外,包含额外的网络访问socket。
该包包括URI 类,后者频繁用于Android 应用程序开发,而不仅仅是传统的联网方面。
1 .http 包含处理SSL 证书的类。
1.wifi 包含在Android 平台上管理有关WiFi(802.11 无线Ethernet)所有方面的类。
1android.telephony.gsm 包含用于管理和发送SMS(文本)消息的类。
一段时间后,可能会引入额外的包来来为非GSM 网络提供类似的功能,比如CDMA 或android.telephony.cdma 等网络。
1.sip 包含Andriod平台上管理有关SIP协议如建立和回应Voip的类9Android.nfc 包含所有用来管理近场通信相关的功能类9在Android中几种网络编程的方式:(1)针对TCP/IP的Socket、ServerSocket(2)针对UDP的DatagramSocket、DatagramPackage。
这里需要注意的是,考虑到Android 设备通常是手持终端,IP都是随着上网进行分配的。
不是固定的。
因此开发也是有一点与普通互联网应用有所差异的。
(3)针对直接URL的HttpURLConnection(4)Google集成了Apache HTTP客户端,可使用HTTP进行网络编程。
针对HTTP,Google 集成了Appache Http core和httpclient 4版本,因此特别注意Android不支持httpclient 3.x系列,而且目前并不支持Multipart(MIME),需要自行添加httpmime.jar(5)使用Web Service。
Android可以通过开源包如jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去实现Webservice(6) 直接使用WebView视图组件显示网页。
基于WebView 进行开发,Google已经提供了一个基于chrome-lite的Web浏览器,直接就可以进行上网浏览网页。
一、我们先来看第一种,针对TCP/IP Socket、ServerSocket的形式。
TCP/IP是一种协议,是一种面向连接的、可靠的协议。
Socket仅仅是对TCP、UDP网络接口的封装,不涉及上层协议。
TCP、UDP传输特性不同,分别适用于不同类型的应用层协议,其中TCP有连接,延时较长,能保证服务质量;UDP无连接,需要应用程序进行数据分包、延时短,效率高,数据包可能丢失或到达对端发生顺序混乱。
在Socket之上可以实现这些RFC标准的应用层协议,也可以自定义实现私有的应用层协议。
在JAVA编程中,经常使用和包来开发socket程序,下面列出所有常用的类,并简单介绍。
关于详细的信息请参看JAVA文档。
.Socket 客户端连接使用的TCP socket.DatagramSocket 客户端和服务端共同使用的UDP socket.ServerSocket 服务端TCP socket监听端口InetAddress IP地址封装类.DataGramPacket 通过DatagramSocket收发的数据包的封装类,包括数据和对端的IP地址、UDP端口.SocketFactory 客户端连接使用的T CP socket.ServerSocketFactory 服务端TCP socket监听端口.ssl.SSLSocketFactory SSL客户端Socket构造器.ssl.SSLServerFactory SSL服务端监听Socket构造器示例代码:android+socket编程实例.rar二、针对UDP的DatagramSocket、DatagramPackage1.对于UDP服务端,首先启动侦听服务,然后得到数据包进行处理,组后根据获得数据包进行反馈。
2.UDP socket没有连接的概念,因此构造完成的DatagramSocket不会发出向对端的网络连接请求,在每一个发送的UDP数据包中包含目的地址和端口。
因为UDP数据不会在对端进行重新组包,因此一次发送的数据长度必须加以限制。
Socket.send(outputPacket);用于发送一个数据包;socket.receive(inputPacket);用于接收一个数据包。
示例代码:服务器端:public class UDPServer{public static void main(String[] args) throws Exception{DatagramSocket udpSocket = new DatagramSocket(8000);while(true){try{// UDP数据读取DatagramPacket packet = new DatagramPacket(new byte[512],512);udpSocket.receive(packet);String msg = new String(packet.getData()), 0,packet.getLength());System.out.println(msg);if(msg.equals("exit")){break;}// UDP数据发送SimpleDateFormat f = new SimpleDateFormat("MMM dd,yyyy kk:mm:ss");String time = "现在的时间是:" + f.format(new Date());packet.setData(time.getBytes());udpSocket.send(packet);}catch(Exception e){e.printStackTrace();}}udpSocket.close();}}客户端:public void client(){InetAddress remoteIP;try {remoteIP = InetAddress.getByName("localhost");DatagramSocket socket = new DatagramSocket();} catch (UnknownHostException e1) {e1.printStackTrace();}BufferedReader wt = new BufferedReader (new InputStreamReader(System.in));System.out.println("input one line ,user \"exit\" to quit the server ");while(true){try{// 读取输入String str = wt.readLine();byte[] outputData = str.getBytes();// UDP socket 数据发送DatagramPacket outputPacket = new DatagramPacket(outputData,outputData.length,remoteIP,8000);socket.send(outputPacket);if(str.equals("exit")){//udp 数据读取DatagramPacket inputPacket = new DatagramPacket(new byte[512],512);socket.receive(inputPacket);System.out.println(new String(inputPacket.getData(),0,inputPacket.getLength()));}}catch(Exception e){e.printStackTrace();}}socket.close();}三、针对直接URL的HttpURLConnection这个就是把请求的方式从HttpClient换成HttpURLConnection就可以了。
没什么可以说的,自己看看吧。
示例代码:无四、Google集成了Apache HTTP客户端,可使用HTTP进行网络编程这个不多说了,网络编程,必须会的。
自己看代码吧。
服务端我使用三种方式:S2SH、只用Struts2、Servlet。
客户端就一种,只不过换个请求的URL。
服务端和客户端交互使用了两种方式:XML、JSON,目前开放平台返回的数据都是支持这两种数据格式的。
所以我也实现了这两种数据格式。
其实还有一种格式,就是google的protocal buffer,这种形式在国内用的人比较少,我也没弄,感兴趣的同学看我提供的文档,自己研究吧。