android开发:获取手机IP和UDP广播

这篇具有很好参考价值的文章主要介绍了android开发:获取手机IP和UDP广播。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        UDP广播在通讯双方互相不知道对方IP的情况下很有用。这种情形我们也可以用遍历网段来实现,但是比较粗暴,如果网段比较大,不是最多256台主机的C类网段的话,很难做遍历。

        UDP广播是解决这种问题的标准方案。

        注意,广播和多播是不同的,广播是同时发送给所有主机,而多播是一个特殊的组,必须明确加入退出。

目录

一、什么是UDP广播

二、获取手机IP

三、UDP广播

3.1 发送

3.2 接收

四、作为知识基础的IP地址知识


一、什么是UDP广播

        UDP广播分两种:目标地址为255.255.255.255的物理广播,发送给物理网络的所有设备,只要物理联通就能收到,不限网段,但是不能穿过路由器(很显然,如果穿过路由器就会传播给全网络了);目标地址为XXX.XXX.XXX.255(C类)的网段广播,发送给同网段的所有设备,能穿过路由器,同一物理网络的其它网段主机接收不到。

        我用手机热点和设备通讯,实测结果如下:

            //物理网络广播,对方网段广播,对方收不到但能发送给这里
            //双方都物理网络广播,仍然是对方收不到但能发送给这里
            //网段广播,对方物理网络广播,能收能发
            //双方都网段广播,能收能发

        上面的“这里”是手机,开启热点,“对方”是连接到热点的PC。从结果看物理网络广播是不可靠的,还是用网段广播比较好。

二、获取手机IP

        从上面分析我们知道,最好使用网段广播,那么就必须先知道目标网段。目标网段可以根据自身的IP地址推算,热点一般都是C类地址,最后一个字节改为255即可。

        代码如下:

    public String getLocalIPAddress() {
        Enumeration<NetworkInterface> enumeration = null;
        try {
            enumeration = NetworkInterface.getNetworkInterfaces();
        } catch (Exception e) {
            error_msg.append(e.toString());
        }
        if (enumeration != null) {
            StringBuilder sb = new StringBuilder();
            // 遍历所用的网络接口
            while (enumeration.hasMoreElements()) {
                NetworkInterface nif = enumeration.nextElement();// 得到每一个网络接口绑定的地址
                Enumeration<InetAddress> inetAddresses = nif.getInetAddresses();
                // 遍历每一个接口绑定的所有ip
                if (inetAddresses != null)
                    while (inetAddresses.hasMoreElements()) {
                        InetAddress ip = inetAddresses.nextElement();
                        if (!ip.isLoopbackAddress() && isIPv4Address(ip.getHostAddress())) {
                            sb.append(ip.getHostAddress());
                        }
                    }
            }
            return sb.toString();
        }
        return "";
    }

    /**
     * Ipv4 address check.
     */
    private static final Pattern IPV4_PATTERN = Pattern.compile("^(" +
            "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}" +
            "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");

    /**
     * Check if valid IPV4 address.
     *
     * @param input the address string to check for validity.
     * @return True if the input parameter is a valid IPv4 address.
     */
    public static boolean isIPv4Address(String input) {
        return IPV4_PATTERN.matcher(input).matches();
    }

         这段代码是网上搜来的,我稍微改了一下,直接返回一个字符串,不过拼接的时候没有加分隔符,正式使用最好是返回一个列表。

        手机可能会返回两个IP地址,一个是移动网络的地址,一个是热点的地址,移动网络的地址通常是10网段,热点地址通常是192.168网段,但是——所谓的热点固定是“192.168.43.*”网段的说法已经过时了

        将192开头的地址的最后一段改成255就是热点的网段地址,对这个网段广播即可。

三、UDP广播

3.1 发送

        注意,网络发送接收因为可能会阻塞,不能在UI线程运行,必须创建子线程。

            String all_ip = getLocalIPAddress();
            InetAddress ip = InetAddress.getByName("192.168.???.255");
            Log(ip.toString());

            {
                Log("发送数据 ");
                DatagramSocket sender = new DatagramSocket();
                DatagramPacket dpSend = new DatagramPacket(all_ip.getBytes(), all_ip.getBytes().length, ip, 6000);
                sender.send(dpSend);
                Log("数据发送成功");
                sender.close();
            }

        设置IP要根据前面获取到的实际IP网段(代码中的问号处),我的手机是179,不是传说的43。第一行就是根据前面的获取IP的方法获得IP列表,不过我只是测试,所以没有进行拆解。

        发送UDP无所谓自身的IP端口,只需要目标IP和端口即可。

3.2 接收

        接收数据需要指定接收端口号,同时提供接收缓冲区。

                Log("接收数据");
                DatagramSocket receiver = new DatagramSocket(6000);
                byte[] buffer = new byte[10];
                DatagramPacket dpReceive = new DatagramPacket(buffer, buffer.length);
                receiver.receive(dpReceive);
                String datamsg = new String(buffer);
                Log("收到数据" + datamsg);
                Log("关闭接收");
                receiver.close();

        这里只接收了一次,只提供了很小的缓冲区,实际使用要使用循环来多次接收并提供足够大的缓冲区。

        在连接热点的PC上使用的是UDP测试软件,使用同样的地址和端口,与手机互相发送接收成功。

四、作为知识基础的IP地址知识

        发现很多人对TCP/IP网络和IP地址的相关知识不是很扎实,配网络的时候不知道子网掩码、网关是什么意思,下面列出几个要点:

  • IP地址分两部分:网段号和主机号,A、B、C类地址分别指1字节网段号、2字节网段号和3字节网段号,同网段可以理解为“应该”连接在同一个物理网络上,可以直达,不需要经过“网关”
  • 子网掩码就是从IP地址上“掩掉”网段号,只保留主机号的一个值,怎么个“掩法”不清楚,反正看上去就是网段号的位全为1,所以对于三个字节网段号的子网掩码就是“255.255.255.0”,255的二进制就是所有位均为1
  • “网关”是本网段和其它网段之间的桥梁,如果要访问的目标地址不是同一个网段,则会被发给网关,所以,两台设备设置为同一个网段,网线直连或通过交换机、HUB连接,是不需要设置网关的。而且,如果是通过网线连接在无线路由器上,无线路由器的设置是无关紧要的(不用理睬路由器的DHCP服务分配的网段,使用静态地址),物理网口之间提供了物理连接,并不需要路由功能介入
  • DNS是个软件服务,用来实现域名到IP地址的查询。网络配置时填写的是DNS服务器的地址,如果有就填,没有就不填,填网络接入商提供的可以,填自建的可以,填任何一个能访问到的也可以
  • ping不通不一定是网络不通,可能只是没有开启ping服务(不对ping请求做出应答),但是硬件设备一般是允许ping的(服务器、个人电脑喜欢禁止ping),所以一般就是IP地址设置问题
  • 常见的10\176.16~31\192.168开头的网段是局域网保留地址,不允许出现在公网,如果你能上网一定是网络接入商做了NAT转换

(这里是结束)文章来源地址https://www.toymoban.com/news/detail-825810.html

到了这里,关于android开发:获取手机IP和UDP广播的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Framework 常见解决方案(20)UDP广播无效问题

    该问题同时存在于android App和Framework系统中。最终效果是在Android系统中直接使用UDP广播无效,有意思的是有的android系统可以,有的Android 系统不行。然而该部分代码自己在Linux上测试时是有效的,代码不变,只是简单的编译移植过来就变得莫名其妙的不行了,头还真是大的不

    2024年02月12日
    浏览(56)
  • android手机版tcp或者udp通讯测试工具,可以用于工业设备或者系统开发时间测试tcp或是udp连接通讯是否正常工作

    介绍 由于工作需要一款安卓的tcp udp测试工具,而市场里没有或者不好用,或者都是广告,现在个人开发者又不让发布应用了,小巧好用不收集用户信息的不收费没有广告的小工具只能自己用,哈哈。 这里分享给大家一款,tcp或者udp通讯测试工具(android),用于工业设备或者系

    2024年02月11日
    浏览(53)
  • 14-3_Qt 5.9 C++开发指南_QUdpSocket实现 UDP 通信_UDP 单播和广播

    UDP(User Datagram Protocol,用户数据报协议)是轻量的、不可靠的、面向 数据报 (datagram) 、无连接的协议,它可以用于对可靠性要求不高的场合。与 TCP 通信不同, 两个程序之间进行 UDP 通信无需预先建立持久的 socket 连接,UDP 每次发送数据报都需要指定目标地址和端口 (如图14-6

    2024年02月14日
    浏览(50)
  • TCP/UDP/IP协议简介

    特指为实现一个相互连接的网络系统上从源地址到目的地址传输数据包(互联网数据包) 所提供必要功能的协议 特点: 不可靠:不能保证IP数据包能够成功的到达它的目的地只能提供尽力而为的传输服务。 无连接:IP并不维护任何关于后续数据包的状态信息。每个数据包的处理

    2024年02月11日
    浏览(42)
  • TCP/IP、UDP和TELNET

           TCP/IP是一个Protocol Stack,包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等许多协议。        最早发源于1969年美国国防部(缩写为DoD)的因特网的前身ARPA网络项目,1983年1月1日,TCP/IP取代了旧的网络控制协议NCP,成为今天的互联网和局域网的基石和标准,由互联网工

    2024年01月25日
    浏览(46)
  • HTTP/UDP/TCP/IP网络协议

    OSI模型定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),每一层实现各自的功能和协议,并完成与相邻层的接口通信。OSI模型各层的通信协议,大致举例如下表所示: 层次 常见协议 应用层 HTTP、SMTP、SNMP、FTP、Telnet、SIP、SS

    2024年04月11日
    浏览(43)
  • TCP、UDP、IP、RTP头长度

    各种协议的数据包头长度如下: UDP 头(8 字节) 源端口(2 字节) 目标端口(2 字节) UDP 数据包长度(2 字节) 校验和(2 字节) RTP 头(12 字节或者24字节) 版本号(2位) 填充位(1位) 扩展位(1位) CSRC计数器(4位) 标记位(1位) 负载类型(7位) 序列号(16位) 时

    2024年02月11日
    浏览(44)
  • 网络编程——TCP/IP协议族(IP协议、TCP协议和UDP协议……)

    1、IP协议简介 IP协议又称 网际协议 特指为实现在一个相互连接的网络系统上从源地址到目的地传输数据包(互联网数据包)所提供必要功能的协议,是网络层中的协议。 2、特点 不可靠 :它不能保证IP数据包能成功地到达它的目的地,仅提供尽力而为的传输服务 无连接 :IP 并不

    2024年02月13日
    浏览(75)
  • TCP、UDP、IP以及ensp基本配置

    目录 一、TCP报文段 二、UDP报文段 三、IP报文段 四、ensp基本配置​          源端口号: 表示发数据那个进程的端口号。          目的端口号: 表示收数据那个进程的端口号。          校验和: 验证数据的传输是否是正确的。          选项 :扩展Tcp功能时

    2024年02月02日
    浏览(52)
  • IP、ICMP、UDP、TCP 校验和算法分享

    以前看计算机网络相关的书,每次看到IP或者UDP报头校验和时,都一瞥而过,以为相当简单,不就是16bit数据的相加吗。最近在研究《TCP/IP详解 卷1:协议》这本书,看到校验和是 16bit字的二进制反码和 (晕,以前都没注意原来是反码和,看来以前看书不仔细啊!罪过,罪过

    2024年02月06日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包