android java udp广播 用于局域网搜索扫描设备。

news2024/11/17 3:38:09
        DatagramSocket socket = new DatagramSocket();
            //设置接收等待时长
            socket.setSoTimeout(LanCommConfig.RECEIVE_TIME_OUT);
            byte[] sendData = new byte[1024];
            //使用广播形式(目标地址设为255.255.255.255)的udp数据包
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("255.255.255.255"), Const.DEVICE_BROADCAST_PORT);
            byte[] hostAddress = Utils.getLocalIPAddress();
            byte[]  b="啦啦啦啦啦啦啦啦啦噢噢噢噢噢噢噢噢".getBytes();
            byte[] broadcastData = packBroadcastData(hostAddress, b);
            sendPacket.setData(broadcastData);
            //发送udp数据包
            socket.send(sendPacket);
            Log.v(TAG, Utils.getDeviceIp() + Const.SEND_SYMBOL + "局域网广播 成功");


    /**
     * 协议规范
     * #(1) + packageType(1) +  ip(4) + dataLength(4) + [data]
     *
     * @param bytes
     * @param hostAddress
     * @return
     */
        private int type = Const.PACKET_TYPE_BROADCAST;
    private byte[] packBroadcastData(byte[] hostAddress, byte[] bytes) {
        //        Trace.d(TAG, "packBroadcastData() :" + Arrays.toString(hostAddress));
        //        Trace.d(TAG, "packBroadcastData() : " + Arrays.toString(bytes));
        byte[] lengthBytes = ConvertUtils.intToByteArray(bytes.length);
        byte[] data = new byte[2 + hostAddress.length + bytes.length + lengthBytes.length];
        data[0] = Const.PACKET_PREFIX;
        data[1] = (byte) type;
        //        Trace.d(TAG, "packBroadcastData() : " + Arrays.toString(lengthBytes));
        System.arraycopy(hostAddress, 0, data, 2, hostAddress.length);
        System.arraycopy(lengthBytes, 0, data, 2 + hostAddress.length, lengthBytes.length);
        if (bytes != null && bytes.length != 0) {
            System.arraycopy(bytes, 0, data, 2 + hostAddress.length + lengthBytes.length, bytes.length);
        }
        Log.v(TAG, Utils.getDeviceIp() + Const.SEND_SYMBOL + "局域网广播 package data:\r\n" + Arrays.toString(data));
        return data;
    }

把自身的ip地址发送过去。

package com.fighter.lancomm.utils;

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;

/**
 * @author sts
 * @date 2020/1/15
 */
public class Utils {

    /**
     * 获取内网IP地址
     *
     * @return
     * @throws SocketException
     */
    public static byte[] getLocalIPAddress() throws SocketException {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress() && (inetAddress instanceof Inet4Address)) {
                    return inetAddress.getAddress();
                }
            }
        }
        return new byte[4];
    }

    public static String ipbyteToString(byte[] ip) throws UnknownHostException {
        return InetAddress.getByAddress(ip).getHostAddress();
    }

    public static String getDeviceIp() {
        try {
            byte[] localIPAddress = getLocalIPAddress();
            return Utils.ipbyteToString(localIPAddress);
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return "";
    }
}

在这里插入图片描述

UDP编程常常使用,但是广播和多播倒很少用到,依据协议的样子,在局域网内该有很大的作为。特意写了两个例子测试一下了广播 。测试连接放在最前面。

组播是一种数据包传输方式,当有多台主机同时成为一个数据包的接受者时,出于对带宽和CPU负担的考虑,组播成为了一种最佳选择。

组播通过把224.0.0.0-239.255.255.255的D类地址作为目的地址,有一台源主机发出目的地址是以上范围组播地址的报文,在网络中,如果有其他主机对于这个组的报文有兴趣的,可以申请加入这个组,并可以接受这个组,而其他不是这个组的成员是无法接受到这个组的报文的。

众所周知的D类IP地址:

D类地址用途

224.0.0.1在一个子网上的所有主机

224.0.0.2在一个子网上的所有路由器

224.0.0.4所有DVMRP协议的路由器

224.0.0.5所有开放最短路径优先(OSPF)路由器

224.0.0.6所有OSPF指定路由器

224.0.0.9所有RIPv2路由器

224.0.0.13所有PIM协议路由器

224.0.0.0-224.0.0.255保留作本地使用,做管理和维护任务

239.0.0.0-239.255.255.255留用做管理使用

255.255.255.255 广播,貌似路由器会丢掉这些数据包的,具体查查资料吧UD

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

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

相关文章

STC15单片机+DS18B20+LCD1602+PCF8574转IIC接口温度显示

STC15单片机+DS18B20+LCD1602+PCF8574转IIC接口温度显示 📺显示效果 LCD1602 IIC接口 ✨本示例基于自制的STC开发板,主控采用的:IAP15W4K61S4相关篇《【PCB开源分享】STC/IAP15W4K61S4开发板》《【开源分享】自制STC15W408AS开发板》🌼接线说明 🌿CD1602+PCF8574转IIC接…

stlink下载调试器使用说明(STM32采用stlink下载程序)

stlink能干什么&#xff1f; 最基本的功能&#xff1a;下载程序。 一般STM32支持ISP串口下载&#xff0c;也支持stlink、jlink等下载器下载 。 使用stlink、jlink下载要比串口方便很多&#xff0c;在keil里直接点击下载就行了&#xff0c;不需要去选择hex文件&#xff0c;速度…

你可能还不知道 golang 的高效编码细节

xdm&#xff0c;我们都知道 golang 是天生的高并发&#xff0c;高效的编译型语言 可我们也都可知道&#xff0c;工具再好&#xff0c;用法不对&#xff0c;全都白费&#xff0c;我们来举 2 个常用路径来感受一下 struct 和 map 用谁呢&#xff1f; 计算量很小的时候&#xf…

特斯拉第10000桩落成,百度地图送10000名充电免单!

「导语」 为庆祝特斯拉在中国大陆落成第10000个超级充电桩&#xff0c;百度地图推出特斯拉车主专属权益。车主们通过百度地图APP&#xff0c;即可实时获取超级充电桩空闲信息、一键规划专属充电路线。12.28-1.2期间&#xff0c;更有10000份充电免单福利限时放送。 在汽车电动…

Linux环境开机自启java应用

Linux环境设置开机自启java应用&#xff08;Linux定时任务&#xff09; crontab是Unix和Linux用于设置需要周期性被执行的指令&#xff0c;是Linux服务器很常用的技术&#xff0c;很多任务都会设置在crontab循环执行。 crontab &#xff1a; 提供给用户控制任务计划的命令&…

WebDAV之葫芦儿·派盘+File Manager

File Manager 支持WebDAV方式连接葫芦儿派盘。 手机文件太多,空间不足、隐藏文件多、文件清理不干净?推荐您一个功能强大的文件管理器,可以让你对手机中的各类文件进行管理,支持快速移动、复制粘贴、压缩解压等等。同时还能对已经安装的程序进行卸载,自动识别手机中的AP…

啥牌子的蓝牙耳机音质好?2023公认音质最好的蓝牙耳机

音乐是有魔力的&#xff0c;繁杂的工作和琐碎的生活&#xff0c;使得大多数人焦虑不安&#xff0c;音乐可以令人放松&#xff0c;蓝牙耳机越多越多&#xff0c;真不知道怎么挑好&#xff0c;品牌成百上千&#xff0c;款式就更不用说了&#xff0c;下面笔者专门整理了一期音质表…

【小西】优化生日品同步网易严选功能,使其支持多SPU对多SKU关系

目录前言思路代码实现实体ThemeActivityGift&#xff1a;spuId由 String类型变为JSONArrayThemeActivityGiftServiceImpl改造handleYxGiftByOperation&#xff1a;保存的是严选的生日品checkSpuIds&#xff1a;校验SPU有效性checkSpuIdExist&#xff1a;校验单个spuId是否存在c…

C语言函数栈帧的创建和销毁

前期学习的时候&#xff0c;我们可能有很多困惑&#xff0c;比如&#xff1a; 局部变量是怎么创建的&#xff1f; 为什么局部变量的值是随机值&#xff1f; 函数是怎么传参的&#xff1f;传参的顺序是怎样的&#xff1f; 形参和实参是什么关系&#xff1f; 函数调用是怎么…

分享丨品牌零售行业三大实践解读,全面搭建并落地数字化运营体系

以下内容来自神策数据创始人 & CEO 桑文锋关于数据驱动零售品牌业务增长的相关分享。点击文末“阅读原文”&#xff0c;了解神策品牌零售行业完整版解决方案。神策从 2020 年深入品牌零售领域&#xff0c;一路走来跌跌撞撞&#xff0c;不过思路越来越清晰&#xff0c;对该领…

Echarts:饼图默认高亮和选中(突出并高亮)/添加单击事件/X轴字符标签换行处理

饼图默认高亮: // 我这里实现的是饼图// 获取 this.sysfbChart this.$echarts.init(document.getElementById(sysfb))// 默认高亮第一个 // highlight:突出 this.sysfbChart.dispatchAction({type: highlight,seriesIndex: 0,dataIndex: 0}); 效果图: 饼图选中(突出并高亮):…

为什么自学 Python 看不进去?

如果刚开始学习python&#xff0c;没看懂&#xff0c;那就多看几次就会了。看不进去很正常&#xff0c;这个过程会很乏味&#xff0c;但是对于你建立牢固的编程思维是必须的。会有看不进去的这个阶段 python学习的秘诀在于对技术了解的广度和对数据结构研究的深度&#xff0c;不…

2022“易观之星”奖项公布,聚焦数字经济,助力数智创新

12月29日&#xff0c;“易观之星”颁奖典礼线上举办&#xff0c;重磅颁出2022“易观之星”奖项。 2022“易观之星”设置数字产品、数字企业2个系列共7大奖项&#xff0c;覆盖金融、品牌零售、汽车出行、文化消费等领域&#xff0c;挖掘和表彰各领域表现卓越的数字产品、数字企业…

【go语言之http模型reactor】

go语言之http模型reactor示例gnet.ServeinitListenerserveactivateEventLoopspolling前面说了go自带的原生netpoll模型&#xff0c;大致的流程就是每一个新的连接都会开启一个goroutine去处理&#xff0c;这样的处理的过程简单&#xff0c;高效&#xff0c;充分利用了go的底层的…

在 K8S 中测试环境中搭建 mongodb

1.可在服务器上面创建 https://kubernetes.io/docs/home/ #k8s官网 搜索Deployment 第一个就是例子 vi rs-mongodb.yaml apiVersion: apps/v1 kind: Deployment #资源类型 metadata:namespace: klvchenname: mongodblabels:app: mongodb spec:replicas: 1selector:mat…

STM32CubeMX学习笔记(50)——USB接口使用(DFU固件升级)

一、USB简介 USB&#xff08;Universal Serial BUS&#xff09;通用串行总线&#xff0c;是一个外部总线标准&#xff0c;用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。USB 是在 1994 年底由英特尔、康柏、IBM、…

量子+智慧交通!玻色量子中标北京城市轨道交通项目

​2022年11月&#xff0c;玻色量子与北京交通大学国家重点实验室组成联合体&#xff0c;接受北京城市轨道交通咨询有限公司委托&#xff0c;三方共同探索和实施量子计算在智慧地铁中的应用场景研究工作。 北京城市轨道交通咨询有限公司 此次科研合作&#xff0c;玻色量子将充分…

IB学生申请牛津剑桥需要注意什么?

HL要选修3门颇具挑战性的课程&#xff0c;SL还要再选3门课程&#xff0c;写好IA&#xff0c;通过包括EE\CAS\TOK在内的3门核心科目&#xff0c;IB课程的学习压力确实挺大。。 对于志在牛剑这样顶尖高校的IB学生而言&#xff0c;压力更大&#xff0c;因为牛剑等顶尖高校对于IB小…

【JavaEE】在Linux上搭建一个Java部署环境

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录在Linux上搭建一个Java部署环境1. 安装jdk2. 安装tomcat3. 安装mysql小结普通小孩也要热爱生活&#xff01; 在Linux上搭建一个Java部署环境 为了部署java web程序&#xff0c;需要安装&#xff1a;jdk、tomcat、m…

Pandas处理大数据的性能优化技巧

Pandas是Python中最著名的数据分析工具。在处理数据集时&#xff0c;每个人都会使用到它。但是随着数据大小的增加&#xff0c;执行某些操作的某些方法会比其他方法花费更长的时间。所以了解和使用更快的方法非常重要&#xff0c;特别是在大型数据集中&#xff0c;本文将介绍一…