Android网络通信的六种方式示例代码


表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);用于接收一个数据包。

2.jpg 

  1.jpg 

示例代码:
服务器端:
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显示网页的问题,比较容易,大家自己看吧。我就不贴实例代码了。



示例代码:
 WebAndroidClient.rar (53.91 KB, 下载次数: 237) 
 WebAndroid.rar (24.71 KB, 下载次数: 151) 
 StrAnd.rar (7.25 KB, 下载次数: 108) 
 sserEx09.rar (469.8 KB, 下载次数: 328) 
 SoapAndroidTeset.rar (213.36 KB, 下载次数: 327) 
 ServletTest1.rar (60.76 KB, 下载次数: 134) 
 android socket编程实例.rar (45.3 KB, 下载次数: 247) 

转载于:https://www.cnblogs.com/phonegap/archive/2012/06/04/2536043.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术分享 | 业务模板的技术实践

源宝导读&#xff1a;“业务模板”作为天际建模平台3.0推出的重要特性&#xff0c;它将元数据复用发挥到了极致&#xff0c;通过业务模板几乎可以覆盖整个建模元数据开发流程&#xff0c;提供业务场景级别的复用能力。本文将介绍“业务模板”的设计原理、实现方案和应用场景。一…

为什么那么好的女孩子还单身?

1 终于知道家里的吃的都是怎么没的了&#xff01;2 我的小鱼干&#xff01;快给我&#xff01;3 这几只狗子真是太皮了&#xff01;4 您点的肉香满溢披萨到了~5 一位新手爸爸分享了自己关于为人父母的感悟6 应采儿&#xff1a;为什么那么好的女孩子还单身&#xff1f; 陈小春&a…

RHCS创建高可用集群apche服务器

实验环境&#xff1a; 系统版本&#xff1a;RHEL5.4 将selinux关闭&#xff0c;刷新iptables -F 配置yum仓库 192.168.0.25 station25.example.com 宿主机 192.168.0.24 station24.example.com 节点(虚拟机) 192.168.0.39 station39.example.com 节点(…

成不了天才,但为何也没成人材?(转)

长期以来&#xff0c;"软件业"一直被视为"智力密集"型的"朝阳"产业&#xff0c;大多数从业者都受过高等教育&#xff0c;其平均素质居于社会各行业的前列&#xff0c;这个产业的顶尖人物被公众视为"知识英雄"&#xff0c;比如微软公司…

.NET 6 RC2 版本发布

原文&#xff1a;bit.ly/3FS9xm7作者&#xff1a;Richard日期&#xff1a;2021-10-12翻译&#xff1a;精致码农-王亮说明&#xff1a;文中有大量的超链接&#xff0c;这些链接在公众号文章中被自动剔除&#xff0c;一部分包含超链接列表的小段落被我删减了&#xff0c;如果你对…

最诡异数学悖论:1+1=1

全世界只有3.14 % 的人关注了爆炸吧知识今天&#xff0c;8岁表妹的老师给她奖励了一块大巧克力&#xff0c;超模君打趣她能不能分给我点&#xff0c;遭到残忍拒绝&#xff0c;超模君很愤怒&#xff0c;暗下决心要神不知鬼不觉地吃上表妹的巧克力。超模君趁表妹在认真做作业的时…

JS URL Parser

为什么80%的码农都做不了架构师&#xff1f;>>> /** *param {string} url 完整的URL地址 *returns {object} 自定义的对象 *description 用法示例&#xff1a;var myURL parseURL(http://abc.com:8080/dir/index.html?id255&mhello#top); myURL.fileindex.ht…

如何使用Instruments诊断App(Swift版):起步

2019独角兽企业重金招聘Python工程师标准>>> 本文由Mr_cyz&#xff08;博客&#xff09;翻译自raywenderlich&#xff0c;欢迎参与我们的翻译活动。原文&#xff1a;Instruments Tutorial with Swift: Getting Started 更新记录&#xff1a;该教程由 James Frost 更…

tcp抓包返回fin_TCP/IP学习二TCP链接建立与断开

今天详细学习下TCP链接的三次握手四次挥手&#xff0c;因为开发web服务还是会经常遇到一些网络问题的。其实这方面的资料很多&#xff0c;可能我们看过很多次但也忘了无数次[捂脸]&#xff0c;这次我主要通过抓包例子来展示这个过程。TCP传输控制协议(TransmissionControlProto…

70%的单身女孩都是这样想的!

1 父爱如山&#xff0c;山就是杵在那里一动不动&#xff01;2 3 单身的女孩不要着急4 哎呀&#xff0c;没有两条小鱼干是起不来了&#xff01;5 一分钟教你画二哈&#xff0c;这次真的厉害了&#xff01;6 披着羊皮的狼&#xff1f;&#xff1f;&#xff1f;你点的每个赞&#…

.NET基金会讨论 .NET 开源事业之路

【编者按】从闭源走向开源&#xff0c;.NET 背后都发生了哪些有趣的故事。本文采访了 6 位微软 .NET 团队成员&#xff0c;分享他们在 GitHub 以及建立 .NET 开源项目的经历。作者 | Richard Lander 译者 | 弯月出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff0…

Process Explorer 15.2:微软增强型任务管理器

Process Explorer 是一款免费的增强型任务管理器&#xff0c;同时也是微软著名工具包Sysinternals下的组件之一。 Process Explorer 能让使用者了解看不到的在后台执行的处理程序&#xff0c;可以使用 Process Explorer 方便地管理你的程序进程。Process Explorer 已经完美的支…

号称最强“抓取”工具,没有搞不到的资源!

全世界只有3.14 % 的人关注了爆炸吧知识分享一个超级好用的工具&#xff0c;绝对用心挑选&#xff0c;让你惊艳&#xff01;不仅帮你赚钱&#xff0c;还能完善生活的方方面面。“能轻松赚钱&#xff0c;真的超爽&#xff01;”好朋友雪球&#xff0c;前段时间负责一个市场营销的…

oracle cpu 100%原因,oracle 12.1 cpu 100%

查看整体负载cpu使用居高不下;基本上整体CPU是百分80%以上了;此时:物理读600MB/s,REDO也不算太高;全为latch free,一般为bug高发区检查相关SQL基本为系统SQL:4b4wp0a8dvkf0,11bzv8fm87zvr,3uqkkfu1crw8y,frjd8zfy2jfdq,8mdz49zkajhw3相关BUG:1 Frequent Execution of Recursive…

C#多线程开发-处理子线程中的异常

C#多线程开发-处理子线程中的异常在平时的多线程开发中&#xff0c;对于异常的处理是至关重要的&#xff0c;千万不能马虎。如果在实际的项目中&#xff0c;对于某些线程中的异常没有处理&#xff0c;会直接导致整个程序崩溃&#xff0c;软件无法使用。其中需要说明的是&#x…

GAC及其作用

http://www.cnblogs.com/smallstone/archive/2010/06/29/1767508.html 一、GAC的作用 全称是Global Assembly Cache作用是可以存放一些有很多程序都要用到的公共Assembly&#xff0c;例如System.Data、System.Windows.Forms等等。这样&#xff0c;很多程序就可以从GAC里面取得…

高校教师抄袭豆瓣博主文章,学校证实:基本属实!记过并调离教学科研岗位...

全世界只有3.14 % 的人关注了爆炸吧知识导读作为高层次人才被杭州市引进&#xff0c;并于杭州师范大学任教的教师郭某某最近陷入了一则被指博士论文涉嫌抄袭豆瓣网友事件&#xff0c;近日&#xff0c;学校调查后证实。本文来源&#xff1a;募格学术综合自&#xff1a;红星新闻 …

linux默认归档目录,Linux系统管理(第4章:目录和文件管理二)

Linux系统管理(第4章&#xff1a;目录和文件管理二)一.练习文件查看及检索操作1.查看/etc/filesystems文件&#xff0c;确认当前系统支持的文件系统类型Cat&#xff1a;用于连接多个文件的内容&#xff0c;更多用于查看文件内容2.分页查看/etc/services文件&#xff0c;了解各种…

一组动图看懂3D打印原理

全世界只有3.14 % 的人关注了爆炸吧知识3D打印是制造业领域的一项新兴技术&#xff0c;被称为“具有工业革命意义的制造技术”。近年来&#xff0c;随着工业技术的进步&#xff0c;3D打印技术得到迅速发展并得到媒体的广泛关注&#xff0c;各类3D打印技术被纷纷报道。下面&…

生产者消费者_【线程通信】生产者消费者模型

1生产者消费者模型介绍生产者消费者模型&#xff0c;是每一个学习多线程的的人都需要知道的模型; 大致情况就是&#xff1a;有两个线程&#xff0c;一个负责生产产品&#xff0c;一个消费产品&#xff0c;两者公用同一块内存区域&#xff0c;也就是产品放在了同一块内存上面&am…