根据Android完好UDP通讯模块的完成

|
TCP与UDP有什么差异?Android 设备上,一个手机经过热门衔接另一个手机。这种场景下,完好的 UDP 通讯模块应该考虑哪些方面,又应该怎样优化。本文将环绕这些问题翻开描绘。

TCP与UDP差异比照剖析,UDP 在 Java 中的运用 根据Android完好UDP通讯模块的完成v 我们都知道,开发一个 Android 使用程序,现在大多数仍是运用的是 Java 言语。在 Java 言语中怎样去运用 UDP 协议呢?

其实 Socket 能够了解为对 TCP、UDP 协议在程序运用层面的封装,提供出一些 api 来供程序员调用开发,这就是 Socket 最表层的意义。

在 Java 中,与 UDP 相关的类有 DatagramSocket、DatagramPacket 等,关于他们的运用,这儿不侧重介绍。

好了,假定我们对他们的运用都已大约了解,能够正式开端本文的内容了。

初始化一个 UDPSocket

首要创立一个叫 UDPSocket 的类。

根据Android完好UDP通讯模块的完成

在结构办法里,我们进行下一些初始化操作,简略来说就是创立一个线程池,记载一下当时时刻毫秒值,至于他们有什么用,再往下看:

根据Android完好UDP通讯模块的完成

这儿我们首要创立了一个 DatagramSocket 作为 客户端 ,其实 UDP 自身没有客户端和服务端的概念,只要发送方和接纳方的概念,我们把发送方暂时当成是一个客户端吧。

创立 DatagramSocket 目标时,传入了一个端口号,这个端口号能够在一个范围内自己界说,表明这个 DatagramSocket 在此端口上监听数据。

然后又创立了一个 DatagramPacket 目标,作为数据的接纳包。

最终调用 startSocketThread 发动发送和接纳数据的线程。

根据Android完好UDP通讯模块的完成

首要 clientThread 线程的意图是调用 DatagramSocket receive 办法,由于 receive 办法是堵塞的,不能放在主线程,所以天然敞开一个子线程了。receiveMessage 就是处理承受到的 UDP 数据报,我们先不看承受数据的这个办法,究竟还没人发音讯呢,天然就谈不上收了。

心跳包坚持 长衔接

来到本文的第一个要点,我们都知道 UDP 自身没有衔接的概念。在 Android 端使用 UDP 和 TCP 的场景是一个手机衔接另一个手机的热门,二者处在同一局域网中。在二者并不知道对方的存在时,怎样才干发现互相呢?

经过心跳包的办法,两边都每隔一段时刻发一个 UDP 包,如果对方接纳到了,那就能知道对方的 ip,建立起通讯了。

根据Android完好UDP通讯模块的完成

这段心跳的意图就是每隔十秒经过 sendMessage 发送一个音讯,看看对方能不能收到。若对方收到音讯,则改写下 lastReceiveTIme 的时刻。

这儿我每隔十秒向对方发送了一个字符串。

根据Android完好UDP通讯模块的完成

这儿就是发送一个音讯的代码。开始在填写 DatagramPacket 的参数之时,我有一个疑问,那个 targetAddress 其实是自己的 ip 地址。问题来了,我填写了自己的 ip 地址和对方的端口,怎样可能找得到对方呢?你可能有一个疑问 192.168.43.255 这个自己的 ip 地址是怎样来的,为什么要这么界说?

首要 android 手机敞开热门,能够了解成一个网关,有一个默许的 ip 地址: 192.168.43.1

这个 ip 地址不是我瞎编的一个,在 Android 源码之中,就是这么界说的:

WifiStateMachine

根据Android完好UDP通讯模块的完成

所以我是知道所谓翻开热门一方的 ip 地址,而 UDP 发送音讯时还有一个特性,就是发出去的音讯,处在整个网关的设备是都能够接纳到的,所以我自己的 ip 地址就定为了 192.168.43.255 ,所以这个 ip 地址和 192.168.43.1 在同一网关中,你发送的音讯,它是能够收到的。

至于怎样判别两个 ip 地址是否处在同一网段中:

判别两个IP巨细及是否在同一个网段中

来做一个阶段总结:

首要我们创立了一个发送端 DatagramSocket,发动了一个心跳程序,每距离一段时刻发送一个心跳包。

由于我知道热门方的 ip 地址是默许的 192.168.43.1 ,而且 UDP 的特性就是发送的音讯同一网段的设备都能够收到。所以发送方的 ip 地址定为了与热门一方处在同一网段的 192.168.43.255 。

事情与数据

事情与数据这两个模块与事务就严密相关了。

先来说数据,两边发送的数据格局你们能够随意界说,当然我觉得仍是界说成惯例的 Json 格局就好。其间能够包括一些要害的事情字段:比方播送心跳包、收到心跳包给对方上线的应对包、超时的下线包、以及各种事务相关的数据等等。

当然发送数据时是转换成二进制数组发送的。发送中文字符、图片等都没有问题,可是可能有一些细节需求留意,随时 google 一下就好了。

再来说下事情:

与事务无关的事情有哪些?

比方:

DatagramSocket.send 办法之后就是发送数据成功的事情;

DatagramSocket.receive 办法之后是数据接纳成功的事情;

在心跳包发送一段时刻,仍没有接到回信时,是衔接超时的事情;

与事务相关的事情就和我们上文说到的数据类型有关了,设备上线,心跳包回应等等。

事情又怎样发送出去,告诉到各个页面呢?用 Listener、或许其他事情总线的三方库都没问题,看你自己挑选了。

处理接纳的音讯

根据Android完好UDP通讯模块的完成

理接纳音讯时,有几个值得留意的点:

receive 办法是堵塞的,没收到数据包时会一向堵塞,所以要放到子线程中;

每次接纳到音讯之后,从头调用 receivePacket.setLength;

收到音讯改写lastReceiveTIme的值,暂停心跳包的发送;

处理收到的数据详细在事务上就是方才我们谈的发送数据的问题,视事务而定。

用户 的概念 上文现已谈过了 UDP 的特性,假设一个手机现已敞开了热门,若多个手机与他相衔接,则多个手机发送的音讯它都能够收到。如果发送方的端口与接纳方的端口相同的话,乃至自己发的音讯,自己都能够收到。这就很为难了,也就是说我们既要除去自己发给自己的音讯,也得区别不同手机发来的音讯,这个时分就理应有一个 用户 的概念。

创立 User 目标,有哪些特点能够看自己的事务,本文的比如就有 ip、imei、以及 softversion。

根据Android完好UDP通讯模块的完成

这儿就不将一切的代码翻开来看了。如果有了手机的 imei 号,那很简单就能够来做身份的区别,你既能够区别不同的发送方,也能够除去掉自己发给自己的音讯。当然如果需求更多的信息,能够依照自己的事务区别,将这些信息作为发送的 messge,经过 Socket 发送。

请尊重我们的辛苦付出,未经允许,请不要转载ca88亚洲城【官】_电子爱好者网的文章!
上一篇:深圳先进院研宣布一种具有低成本、可印刷、高电导率等功能特性的柔性可拉伸导电资料-电子发烧友网
下一篇:音频紧缩技能原理