手机作为一种通讯终端(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 Java.net 提供与联网有关的类,包括流和数据包(datagram)sockets、Internet 协议和常见 HTTP 处理。该包是一个多功能网络资源。有经验的 Java 开发人员可以立即使用这个熟悉的包创建应用程序。 1 java.io 虽然没有提供显式的联网功能,但是仍然非常重要。该包中的类由其他 Java 包中提供的 socket 和连接使用。它们还用于与本地文件(在与网络进行交互时会经常出现)的交互 1 java.nio 包含表示特定数据类型的缓冲区的类。适合用于两个基于 Java 语言的端点之间的通信。 1 org.apache.* 表示许多为 HTTP 通信提供精确控制和功能的包。可以将 Apache 视为流行的开源 Web 服务器。 1 android.net 除核心 java.net.* 类以外,包含额外的网络访问 socket。该包包括 URI 类,后者频繁用于 Android 应用程序开发,而不仅仅是传统的联网方面。 1 android.net.http 包含处理 SSL 证书的类。 1 android.net.wifi 包含在 Android 平台上管理有关 WiFi(802.11 无线 Ethernet)所有方面的类。 1 android.telephony.gsm 包含用于管理和发送 SMS(文本)消息的类。一段时间后,可能会引入额外的包来来为非 GSM 网络提供类似的功能,比如 CDMA 或 android.telephony.cdma 等网络。 1 Android.net.sip 包含Andriod平台上管理有关SIP协议如建立和回应Voip的类 9 Android.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编程中, 经常使用java.net和javax.net包来开发socket程序,下面列出所有常用的类,并简单介绍。关于详细的信息请参看JAVA文档。
Java.net Java.net.Socket 客户端连接使用的TCP socket Java.net.DatagramSocket 客户端和服务端共同使用的UDP socket Java.net.ServerSocket 服务端TCP socket监听端口 Java.netInetAddress IP地址封装类 Java.net.DataGramPacket 通过DatagramSocket收发的数据包的封装类,包括数据和对端的IP地址、UDP端口
Javax.net Javax.net.SocketFactory 客户端连接使用的T CP socket Javax.net.ServerSocketFactory 服务端TCP socket监听端口 Javax.net.ssl.SSLSocketFactory SSL客户端Socket构造器 Javax.net.ssl.SSLServerFactory SSL服务端监听Socket构造器
示例代码: android+socket编程实例.rar
二、针对UDP的DatagramSocket、DatagramPackage 1.对于UDP服务端,首先启动侦听服务,然后得到数据包进行处理,组后根据获得数据包进行反馈。 2.UDP socket没有连接的概念,因此构造完成的DatagramSocket不会发出向对端的网络连接请求,在每一个发送的UDP数据包中包含目的地址和端口。因为UDP数据不会在对端进行重新组包,因此一次发送的数据长度必须加以限制。Socket.send(outputPacket);用于发送一个数据包;socket.receive(inputPacket);用于接收一个数据包。
<ignore_js_op style="word-wrap: break-word;">
<ignore_js_op style="word-wrap: break-word;">
示例代码: 服务器端: 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,这种形式在国内用的人比较少,我也没弄,感兴趣的同学看我提供的文档,自己研究吧。注意把里面的IP换成自己电脑的IP地址。
示例代码: 服务端:ServletTest1.rar、StrAnd.rar、WebAndroid.rar 客户端:WebAndroidClient.rar
参考网址: http://www.cnblogs.com/zhangdong ... /04/19/2020688.html http://blog.csdn.net/woshisap/article/details/6621571 http://www.360doc.com/content/11/0521/01/4154133_118259561.shtml
注意:在只使用Struts2的服务器端,可以这么配置: <package name="struts-main" extends="json-default" > <action name="*UserAction" class="userAction" method="{1}"> <result type="json"></result> </action> </package> 也可以这么配置: <package name="struts-main" extends="struts-default" > <action name="*UserAction" class="userAction" method="{1}"> <result name="register">/WEB-INF/page/register.jsp</result> <result name="save">/WEB-INF/page/index.jsp</result> </action> </package>
但是其实返回数据的时候都是封装JSON字符串,没用到第一种形式的配置的功能。据说,用第一种配置方式,struts2可以自动把返回的数据封装成JSON字符串的形式,但是我没测试成功。。。。我返现返回什么格式还是什么格式,并没有把数据自动封装成JSON返回。 在使用S2SH的服务端,就不能用第一种方式配置。只能用第二种方式,然后服务端封装JSON返回客户端。如果用第一种方式配置,就会发生404错误。无法找到服务器端。 在使用Servlet的服务端,可以通过下面这种方式设置返回类型,但是其实没用,你设置了,它也不返回。你只能自己封装XML文件或者JSON字符串,然后返回。 response.setContentType("application/json;charset=utf-8");
(5)使用Web Service 我之前只听说过什么事webservice,因此主要是参考下面文章实现的DEMO,他给出了一些实例代码,不全,我给基本补全了。显示天气信息我都在LOG输出了,没有显示在界面上,如果大家觉得不爽,可以把信息直接显示在界面上就可以了。因为我被这个问题困扰了2天,弄的很崩溃,所以就没继续弄。大家自己看吧。 那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。在Android中,第三方公司提供了基于webservice的jar包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar http://www.cnblogs.com/zhangdong ... /04/19/2020688.html http://www.cnblogs.com/ghj1976/archive/2011/04/26/2028904.html 示例代码:SoapAndroidTeset.rar、sserEx09.rar
(6) 直接使用WebView视图组件显示网页 这就是使用webview显示网页的问题,比较容易,大家自己看吧。我就不贴实例代码了。 |
|
相关推荐
基于android的网络通信六种方式示例代码
Android 网络通信的六种方式示例代码.zip源码资源下载Android 网络通信的六种方式示例代码.zip源码资源下载
android网络通信的六种方式示例代码 很经典 能立刻运行
Android网络通信的六种方式示例代码.zip
Android 网络通信的六种方式示例代码源码.rar
Android 网络通信的六种方式示例代码.zip项目安卓应用源码下载Android 网络通信的六种方式示例代码.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
基于Android的网络通信的六种方式示例代码
Android应用源码之网络通信的六种方式示例代码
安卓Android源码——网络通信的六种方式示例代码.zip
网络通信的六种方式示例代码 android socket编程实例 ServletTest1 SoapAndroidTeset sserEx09 StrAnd WebAndroid WebAndroidClient
Android程序研发源码网络通信的六种方式示例代码.zip
Android应用源码之网络通信的六种方式示例代码.zip项目安卓应用源码下载Android应用源码之网络通信的六种方式示例代码.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发...
安卓Android源码——精典源码之网络通信的六种方式示例代码.zip
Android 应用项目开发源码 参考和学习使用
Android应用源码开发Demo,主要用于毕业设计学习。
Android应用源码开发Demo,主要用于毕业设计学习。