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();// 遍历每一个接口绑定的所有ipif (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转换

(这里是结束)

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

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

相关文章

ChatGPT 上线一周年

一年前&#xff0c;ChatGPT 正式上线&#xff0c;这无疑是个革命性的时刻&#xff0c;仅仅 6 周&#xff0c;ChatGPT 用户量达到 1 个亿。 这一年元宇宙作为概念垃圾彻底进入下水道&#xff0c;而 ChatGPT 和 AI 则席卷全球。 仅仅这一年&#xff0c;依托于 ChatGPT&#xff…

CSS 绝对定位问题和粘性定位介绍

目录 1&#xff0c;绝对定位问题1&#xff0c;绝对定位元素的特性2&#xff0c;初始包含块问题 2&#xff0c;粘性定位注意点&#xff1a; 1&#xff0c;绝对定位问题 1&#xff0c;绝对定位元素的特性 display 默认为 block。所以行内元素设置绝对定位后可直接设置宽高。脱离…

【C++】string类模拟实现过程中值得注意的点

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.有关const的使用 &#x…

3.3 路由器的远程配置

实验3.3 路由器的远程配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施&#xff08;一&#xff09;、配置通过Telnet登录系统1.RA的基本配置2.RB的基本配置3.在RA上配置Telnet用户登录界面 &#xff08;二&#xff09;、配置通过STelnet登录系统1.RA的基本配…

熬夜会秃头——beta冲刺Day2

这个作业属于哪个课程2301-计算机学院-软件工程社区-CSDN社区云这个作业要求在哪里团队作业—beta冲刺事后诸葛亮-CSDN社区这个作业的目标记录beta冲刺Day2团队名称熬夜会秃头团队置顶集合随笔链接熬夜会秃头——Beta冲刺置顶随笔-CSDN社区 目录 一、团队成员会议总结 1、成员…

Trie字符串统计(字典树的插入与查找)

题目&#xff1a; 插入模拟&#xff1a;假如现在要依次插入cat,car,busy,cate,bus,car 查找&#xff1a; 代码&#xff1a; import java.util.Scanner;public class Main {public static int[][] chnew int[100010][26];public static int[] cntnew int[100010];public static…

java: 警告: 源发行版 17 需要目标发行版 17

这是一个编译期的报错提示 源发行版 17 , 即说明你的maven项目当前指定的编译版本是jdk17&#xff0c;需要目标发行版 17则是说明你的idea中实际选择的jdk版本并非17 检查你项目中的pom文件中的配置 <properties><java.version>17</java.version><prop…

45. 跳跃游戏 II

根据题解思路 在上一道题的基础上&#xff0c;我们可以知道最远的起跳点位置k。 在这道题中&#xff0c;要求到达最后一个元素的最小跳跃次数&#xff0c;即按照最远起跳位置来计算&#xff0c;跳得越远&#xff0c;越能够早点到达最后的元素位置。 于是我们只需要在原来计算最…

Windows的常用cmd命令总结

文章目录 一.盘符切换二: cd命令(打开文件/文件夹)三:查看目录四.创建和删除文件夹五.查看本机ip地址六.清除当前屏幕七.复制文件到另一个地方八.移动文件到另一个地方九.删除文件&#xff08;不能删除文件夹&#xff09;十.测试网络连接十一.停止任务进程Windows快捷键总结大全…

详细学习Pyqt5的5种项目视图(Item View)

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4种项目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…

KNN实战-图像识别

数据说明 是在循环0-9的数字一直循环500次所得到的数据&#xff0c;然后以手写照片的形式存在 识别的步骤 加载数据构建目标值构建模型参数调优可视化展示 加载数据 import numpy as np import matplotlib.pyplot as plt # 记载数据 data np.load(./digit.npy) data构建目…

webpack 使用打包报错 ERROR in node_modules\@types\node\ts4.8\assert.d.ts

报错如下&#xff1a; 解决方式&#xff0c;先查看自己的 node 版本 node -v然后再安装 types/node 对应版本&#xff0c;比如我的如下 npm i types/node14.10.0 -D然后再次打包&#xff0c;就没有报错了

Hdoop学习笔记(HDP)-Part.19 安装Kafka

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

Hdoop学习笔记(HDP)-Part.03 资源规划

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

介绍 TensorFlow 的基本概念和使用场景。

文章由AI生成 TensorFlow是谷歌公司开发的一款开源的机器学习框架&#xff0c;它是当前业内最流行的深度学习框架之一。TensorFlow可以用来构建神经网络&#xff0c;处理自然语言&#xff0c;图像识别&#xff0c;语音识别等模型。TensorFlow的基本概念和使用场景可以总结如下…

Day47力扣打卡

打卡记录 多边形三角剖分的最低得分&#xff08;区间DP&#xff09; 链接 class Solution:def minScoreTriangulation(self, values: List[int]) -> int:n len(values)f [[0] * n for _ in range(n)]for i in range(n - 3, -1, -1):for j in range(i 2, n):f[i][j] mi…

iris+vue上传到本地存储【go/iris】

iris部分 //main.go package mainimport ("fmt""io""net/http""os" )//上传视频文件部分 func uploadHandler_video(w http.ResponseWriter, r *http.Request) {// 解析上传的文件err : r.ParseMultipartForm(10 << 20) // 设置…

高并发下缓存失效问题-缓存穿透、缓存击穿、缓存雪崩、Redis分布式锁简单实现、Redisson实现分布式锁

文章目录 缓存基本使用范式暴露的几个问题缓存失效问题---缓存穿透缓存失效问题---缓存击穿一、单机锁正确的锁粒度不正确的锁粒度无法保证查询数据库次数是唯一 二、分布式锁getCatalogJsonData()分布式锁演进---基本原理分布式锁(加锁)演进一&#xff1a;删锁失败导致死锁分布…

牛客小白月赛82(A~C)

目录 A.谜题&#xff1a;质数 输入描述 输出描述 输入 输出 解析 B.Kevin逛超市 2 (简单版本) 输入描述 输出描述 输入 输出 思路 C.被遗忘的书籍 题目描述 输入描述 输出描述 输入 输出 输入 输出 思路 比赛链接 牛客小白月赛82_ACM/NOI/CSP/CCPC/ICPC算…

C++基础 -28- 友元

友元用于访问类中的所有数据成员 类中的私有成员&#xff0c;类外不可访问 定义友元的格式&#xff08;友元函数必须要在类内&#xff0c;声明&#xff09; friend void show(person &b); 使用友元访问类的所有成员 #include "iostream"using namespace std…