安卓学习日志(2)UDP通信

ISO/OSI标准是网络的国际标准,由七个层次组成:物理层、数据链路层、网络层、运输层、表示层、会话层、应用层。IP(Internet Protocol)互联网络协议属于网络层协议。而常用的UDP和TCP属于传输层协议。简单来说,两者的区别在于是否基于连接。TCP在正式收发数据前,双方必须建立可靠的连接,速度慢、消耗大,但是可以确保消息正确发送,连接时经历三次握手,断开时则要经历四次握手。UDP无需握手建立连接,速度快、消耗少,但是不能确保不丢包。本文重点讨论UDP。

UDP可分为单播、组播(多播)、广播三总。顾名思义,单播为一对一通信方式,即发送方制定对方IP地址发送。组播则是一对多通信,通过向一个组播组IP发送数据,路由器自动将数据发送到所有监听这个组的终端(可以包括发送方自身)。建立组播通信的基本步骤可以分为:1.建立socket;2.绑定socket与端口;3.加入组播组;4.通过发送接收函数收发;5.关闭socket。广播类似于组播,区别是向子网内每一个终端投递一份数据包,使用的IP地址范围不同。关于Android下组播和广播的实现,可以参考http://blog.csdn.net/killtl/article/details/7296244

Android与服务器的通信方式主要有两种,一是HTTP通信,一是Socket通信。HTTP协议:简单对象访问协议,对应于应用层,基于TCP连接,默认80端口,连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据,所以是短连接;而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求,是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉。Socket本身并不是协议,而是一个调用接口(API)。关于Socket基本原理可见http://blog.csdn.net/mad1989/article/details/9147661。本文重点讨论利用Socket/UDP/IP通信。

博主做的项目是要在WiFi局域网内实现手机对多台设备的指令发送,这些设备都有设备号,并且已经与用户绑定。博主开始的想法是手机上线后开启TCP服务线程并发送UDP广播,内容为路由器分配给手机的IP,设备收到IP后即向手机发送TCP连接请求,由此经历三次握手后建立连接开始通信,为服务多台设备,每个TCP请求到达时需要新开Socket线程,并且用一个Manager管理这些Socket线程,设备端若考虑到一个用户可能使用多个手机,则也需要这样做。后来将广播改为组播,将所有手机和设备添加到一个组播组,可以节省网络资源。最终实现除了上文提到的UDP组播收发,类似于TCP聊天室程序,博主参考了很多
http://blog.csdn.net/baolong47/article/details/6735853,在此感谢。

后来博主感觉,为了实现这么一个简单的功能,这样写似乎又有点复杂。TCP虽然安全可靠,但是局域网内UDP丢包概率较低,同时UDP简单快速,用在博主这个项目中是合适的。虽然所有的手机和设备在同一片WiFi热区内被加入到同一个UDP组播组,但是一条指令的发送目标是手机还是设备,具体哪一台设备或手机,需要一个通信协议协调。所以博主的最终方案是,自始至终使用UDP通信,写了一个通信协议,基本格式为:目标类型@目标标识@指令类型@指令内容@发送方标识,如此可以实现发现设备,发送指令,接收设备信息等全套功能,同时速度也很快。

最后附上用到的一个功能函数,获取主机IP和MAC地址的函数,参考http://blog.sina.com.cn/s/blog_7ffb8dd501012z0v.html

项目参考博文:
http://blog.csdn.net/sdvch/article/details/13615507
http://blog.csdn.net/gf771115/article/details/22850333
http://blog.csdn.net/mad1989/article/details/9147661
http://158067568.iteye.com/blog/901052
http://158067568.iteye.com/blog/901048
http://bbs.csdn.net/topics/390676156?page=1
http://blog.csdn.net/killtl/article/details/7296244
http://my.oschina.net/cwzhang/blog/213757?fromerr=mjuW4e6F
http://blog.csdn.net/perfect5085/article/details/7283067
http://blog.sina.com.cn/s/blog_7ffb8dd501012z0v.html
http://www.apkbus.com/android-240733-1-1.html?_dsign=42ba5c97
http://blog.csdn.net/yanzi1225627/article/details/21506489
http://www.cnblogs.com/shaocm/p/3708405.html
http://blog.csdn.net/baolong47/article/details/6735853

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值