Android学习笔记3:UDP广播通信程序

linux UDP 局域网内广播通信服务器端和客户端 在调试局域网内通过UDP协议获取其他设备IP地址时,服务器使用UDP 广播后, 客户端设备无响应. 先研究一下正常情况下, UDP广播通信方法. 参考了网络上一写资料. 代码整理如下: 服务器端向: 255.255.255.255:6023发送UDP广播: serverUDP.c #include #include #include #include #include 阅读详情

关于android编程的认识不断的在更新,可能很快就会为小编这些菜鸟级文章感到不好意思,呵呵 。

手机远程关机程序终于搞定,为了加深印象也为了与大家分享,抽时间来写这篇文章了。

 

这个是windows上运行的服务程序,它监听PC机的UDP 9998端口,响应两个命令:

1.接收到"SCAN"时给对方发回计算机名称

2.接收到"CLOS"时直接关机

APP界面如下:

现在APP要做的就是:

1.按下[]扫描]按钮时广播发送UDP包"SCAN",并得到回应后将接收信息(也就是计算机名)显示到TextView。并记住对方IP地址。

2.按下[关机]按钮时,向记忆的IP地址发送“CLOS”实现远程关机。

 

首先实现了一个UDP收发功能的类

package cn.chipart.udptst;

import android.os.Message;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

 class UDPClient extends Thread{
    final static int udpPort = 9998;
    final static String hostIp = "192.168.1.255";//广播地址
    private static DatagramSocket socket = null;
    private static DatagramPacket packetSend, packetRcv;
    private boolean udpLife = true; //接收线程退出标志
    private byte[] msgRcv = new byte[1024]; //接收消息
    private InetAddress remoteAddress = null; //存储对方地址
    public MainActivity.MyHandler uiHandler;//向主UI发送消息的句柄

    public UDPClient() {
        super();
    }

    //返回udp生命线程因子是否存活
    public boolean isUdpLife() {
        if (udpLife) {
            return true;
        }

        return false;
    }

    //更改UDP生命线程因子
    public void setUdpLife(boolean b) {
        udpLife = b;
    }

    //发送广播消息
    public void sendBroadcast(String msgSend) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                InetAddress hostAddress = null;

                try {
                    hostAddress = InetAddress.getByName(hostIp);
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }

                packetSend = new DatagramPacket(msgSend.getBytes(), msgSend.getBytes().length, hostAddress, udpPort);

                try {
                    socket.send(packetSend);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        thread.start();
    }

    //回应消息
    public void sendResponse(String msgSend) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                packetSend = new DatagramPacket(msgSend.getBytes(), msgSend.getBytes().length, remoteAddress, udpPort);

                try {
                    socket.send(packetSend);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        thread.start();
    }

    @Override
    public void run() {
        try
        {
            socket = new DatagramSocket();
            socket.setSoTimeout(3000);//设置超时为3s
        } catch (SocketException e)
        {
            e.printStackTrace();
        }
        packetRcv = new DatagramPacket(msgRcv, msgRcv.length);
        while (udpLife)
        {
            try
            {
                socket.receive(packetRcv);
                String RcvMsg = new String(packetRcv.getData(), packetRcv.getOffset(), packetRcv.getLength());

                remoteAddress = packetRcv.getAddress();//获取对方IP保存到remoteAddress

                //发送消息给UI线程
                Message message = new Message();
                message.what = 1;
                message.obj = RcvMsg;
                uiHandler.sendMessage(message);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }

        socket.close();
    }
}

这个类继承自Thread,也就是有线程功能的,在线程的运行run函数中实现接收操作

另外两个重要的功能函数是sendBroadcast和sendResponse ,他们分别用于广播发送和向对方发送数据。

Activity中主要的代码如下:

    private UDPClient client = null;
    private final MyHandler myHandler = new MyHandler(this);

    public class MyHandler extends Handler{
        private  final WeakReference<MainActivity> mActivity;
        public MyHandler(MainActivity activity){
            mActivity = new WeakReference<MainActivity>(activity);
        }
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 1:
                    txt_Recv.setText(msg.obj.toString());
                    break;
                default:
                    break;
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindWidget();   //控件绑定
        listening();    //监听事件

        client=new UDPClient();
        client.uiHandler = myHandler;//用于线程给activity发送消息
        client.start();
    }

关于消息接收处理的handler,据说这样写可以防止内存泄露,但总是有一条警告

警告: [deprecation] Handler中的Handler()已过时  public MyHandler(MainActivity activity){
                                               ^

不太明白是什么意思,至今没有解决。但这不影响编译生成可执行文件,暂时放一放了。

 

完整源代码:下载

 

 

 

 

 

Android例子源码简单实现手机与电脑的UDP通讯.zip 本项目是一个测试安卓和电脑UDP通讯的例子源码,项目自带一个winform的客户端,运行之前需要做两件事,第一件事是必须知道电脑的ip地址,如果是内网可以用cmd的ipconfig命令看一下电脑的ipv4地址,如果是模拟器的话那电脑的IP地址就是10.0.2.2,然后在安卓源码里面替换电脑IP,第二件事是打开项目里自带的exe点击开启端口监听,这样电脑和安卓客户端就可以使用UDP协议进行互发消息通讯了,本项目默认编译版本4.2.2.编码GBK。 立即下载

相关推荐

android 广播发送接收UDP

1、用来测试Android手机为啥接收不到UDP广播报文。

Android局域网内快速查找某个设备的IP地址(UDP通信)

需求:通过udp传输方式,快速找到同局域网内某设备 思路:需要某设备发送,手机接收。或者手机发送,设备接收,两个设备需在同一局域网内 1、建立udpsocket服务 2、提供数据,并将数据封装到数据包中 3、通过socket服务的发送功能,将数据包发送出去。 4、关闭资源。 DatagramSocket:此类表示用来发送和接收数据报包的套接字。在 DatagramSocket 上总是启用 UDP ...

Sir的专栏 4502

STM32HAL库硬件I2C驱动INA226避坑指南:从寄存器配置到电流测量实战

本文详细解析了使用STM32的HAL库硬件I2C驱动INA226电流/功率监测芯片的完整流程与常见陷阱。内容涵盖从硬件I2C配置、寄存器(特别是配置与校准寄存器)的深度解析、健壮的驱动函数封装,到实战中的校准技巧与滤波优化,旨在帮助开发者避开通信失败、数据不准等典型问题,实现高精度电流测量。

x1y2z的博客 791

android udp获取ip,安卓开发 局域网UDP获取服务器Ip地址

try {mHandler.post(new myRunnable("开始UDP连接"));InetAddress serverAddress = InetAddress.getByName("255.255.255.255");//广泛广播地址byte[] bytesToSend = "test_client".getBytes();int servPort = 6000;//与服务端一致的po...

weixin_29504987的博客 695

开放平台 - 互动玩法演进之路

随着直播业务和用户规模日益壮大,如何丰富直播间内容、增强直播间内用户互动效果,提升营收数据变得更加关键。

bilibili_TC的博客 1739

MTK平台LCD驱动开发实战:从零开始点亮你的Android屏幕

本文详细介绍了在MTK平台进行Android LCD驱动开发的完整流程。从理解LK与Kernel双核驱动框架入手,手把手讲解驱动结构体、屏幕参数配置、初始化序列编写以及PLL_CLOCK计算等核心步骤,并提供了系统集成配置与实用的调试避坑指南,帮助开发者高效点亮新屏幕。

terraform7cloud的博客 292

Android 网络通信 之 UDP

目录 本文导读 需求效果 代码实现 本文导读 本文将介绍基于UDP 协议的 Socket 通信,一些注意事项在这里提前说明。 1)Android 为了确保用户流畅的操作体验,一些耗时的任务不能够在 UI 线程中运行,像网络访问/通信就属于这类任务,因此必须新开线程执行这些操作。 2)Android 规定除了 UI 线程外,其它线程都不可以对 UI 控件访问和操控。 3)当后台线程获...

蚩尤后裔-汪茂雄 7173

《Mac 配置 Codex App 代理完整指南:端口检测 + launchctl 设置 + 取消代理》

本文详细介绍 Mac 上 Codex App 代理配置完整流程,包括如何查看代理端口、如何使用 launchctl 设置 HTTP_PROXY / HTTPS_PROXY、如何验证代理是否生效以及如何取消代理配置。适用于 Mac Codex 代理、Mac HTTP_PROXY 设置、Mac ChatGPT 代理等开发环境场景。

weixin_50029578的博客 5335

android udp 广播通信,Android单播UDP可以工作,但是广播不能

对于一项任务,我们尝试设置多个Android设备,通过本地WiFi网络从笔记本电脑接收UDP广播。在工作原理:两台笔记本电脑上的Python终端能够相互发送和接收UDP广播或单播。在Android设备可以接收直接发送到其IP的UDP消息什么不起作用:Android设备(LG/googlenexus4)不接收UDP广播消息(另一台运行Python的笔记本电脑接收到)有什么建议吗?以下是我们每个组件的...

weixin_29311017的博客 597

杰理JL7033C芯片运行SoundFont音色库教程

本教程介绍如何在杰理JL7033C芯片上移植TinySoundFont音色库,实现MIDI播放功能。关键步骤包括:获取TinySoundFont开源代码,创建音色库声音播放数据流,封装核心功能文件。硬件需配备外部PSRAM和NOR FLASH存储音色库,软件使用杰理SDK和工具链。移植后系统可支持40个voice,满足MIDI播放和电子琴演奏需求。教程详细说明了代码移植过程,包括音色库文件处理、内存配置和音频流水线设置。

qq_42014563的博客 610

41、矩形和圆柱形开槽微带贴片天线设计及性能分析

本文提出了一种适用于ISM频段(2.4 - 2.48 GHz)的微带圆形贴片天线,专为生物医学植入和可穿戴设备设计。通过在贴片上蚀刻矩形槽并去除圆柱形槽,实现了小型化与性能优化。采用Rogers 3010基板材料,结合缺陷接地结构(DGS)技术,有效改善了带宽、回波损耗和极化纯度。仿真结果显示,天线在弯曲状态下仍保持良好性能,回波损耗达-13 dB,VSWR为1.6,方向性提升至5.38 dB。与以往设计相比,本次设计在回波损耗和谐振频率稳定性方面表现优异,具备良好的生物相容性和应用潜力。未来将从开槽结构、

github5actions的博客 258

ue4打包安卓发送udp报文_UE4 socket UDP通信

最近公司项目要用广播通信 写了一个socket udp通信 最后项目还是用unity 没用上 所以拿出来和大家分享下server.jpg (353.71 KB, 下载次数: 233)2017-3-1 09:45 上传这个是接收端的client.jpg (365.79 KB, 下载次数: 230)2017-3-1 09:45 上传这个是客户端的 图上这个是发给指定ip的要给局域网广播的话 将ip...

weixin_29499829的博客 626

杰理外挂flash使用教程(四):制作fat32文件系统格式的资源文件

本文档提供了FAT文件系统镜像生成与资源打包的完整指南,包含两种实现方案:推荐的WSL/Ubuntu环境方案和Windows原生方案。详细说明了从创建空白镜像、格式化、资源文件复制到最终打包为设备可用的res.bin文件的完整流程,并对比了FAT32与FAT16的特性差异。文档还包含关键文件说明、使用注意事项和典型应用场景,适用于嵌入式系统开发、固件升级等场景。

qq_42014563的博客 1339

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

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

编程之道在明明德在亲民在止于至善 3105

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android udp 广播通信,Android开启热点进行UDP通信中的坑

1、写在前面:2018年的第一篇文章,最近在使用UDP协议进行硬件通信,大家都知道UDP协议通信必须在同一个局域网内,但是每个用户家的wifi都是不一样的,硬件设备是无法只值连接到用户家的wifi的。所以为了解决这个问题,提出一个思路,让手机开启热点,然后把硬件链接到手机的热点上。再由手机告诉硬件去链接用户家里的wifi,这样手机和设备就都能连接到用户家的wifi了,就能愉快的进行通信了。那么怎么...

weixin_34691461的博客 805

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android udp 收发例子_教你如何实现《UDP/TCP》可靠网络传输

结构和传输原理总结有福利送1.源端口 2.目的端口 3.长度 UDP用户数据报的长度,其最小值是8 4.校验和 检测UDP用户数据报在传输中是否有错。有错就丢弃对于TCP/IP是分四层的,分别是应用层,传输层,网络层,网络接口层。 IP数据报由首部和数据两部分组成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。UDP是面向报...

weixin_39715513的博客 425

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

理解 UDP 协议与实战:Android 使用 UDP 发送和接收消息

UDP(User Datagram Protocol,用户数据报协议)是一个无连接的网络通信协议。与 TCP 不同,UDP 不建立连接,不保证数据的顺序和完整性。它的特点是简单、高效,适用于实时性要求较高、对数据丢失容忍的应用,如音视频传输、DNS 查询等

居然是阿松的博客 2348

Android发送和接收UDP广播

在Android平台上实现UDP广播的发送和接收

wujushan的博客 1万+

android socket 分段发送_Android 基于UDP通信的设计

最近在搞Android,对UDP通信也有了一定的认识,希望写篇文章好好总结下,也能对这块的学习能有更清晰的认识。何为UDP?国际惯例,先上度娘上的解释:UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IE...

weixin_32046225的博客 300

android 智能电视视频播放器UDP通信

在做智能电视应用的时候,最头疼的就是焦点问题,特别是对于个人开发者,没有设备这是最最头疼的事情了,在没有设备的情况下,怎么实现智能电视应用呢,接下来我是用TV程序来做演示的,所以接下来的所有操作是在有网络的情况下,TV链接到一个路由器上面,做过开发的人都知道Socket编程分为两种一个是可靠传输的TCP,另一个是不可靠传输的UDP,TCP需要知道对方的IP才能实现,UDP虽然不可靠,但是它可以实现

成长的味道 3463

android httpurlconnection 超时 重发_Android 基于UDP通信的设计

最近在搞Android,对UDP通信也有了一定的认识,希望写篇文章好好总结下,也能对这块的学习能有更清晰的认识。何为UDP?国际惯例,先上度娘上的解释:UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IE...

weixin_39613385的博客 290

Android UDP简单实现

说明测试程序分为两个部分:Android客户端、Java服务端。 Android客户端:向局域网UDP广播字符串“Hello, World!”,端口号是11000。然后打印所有收到的UDP广播。 Java服务端:监听11000的UDP广播,收到UDP广播后,发送一个JSON串。 Android客户端public class MainActivity extends Activity { //

Yano_nankai的博客 1194

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

该问题同时存在于androidApp和Framework系统中。最终效果是在Android系统中直接使用UDP广播无效,有意思的是有的android系统可以,有的Android 系统不行。然而该部分代码自己在Linux上测试时是有效的,代码不变,只是简单的编译移植过来就变得莫名其妙的不行了,头还真是大的不行。在移植到android的过程中实际上是使用android走JNI调用C++的方式来使用,这里就不详述了。最后分析,发现,果然是android的问题。

wangdsh的博客 1673

Android Socket UDP 点对点,或者广播通讯,包含发送端和接收端

Android Socket UDP 包含发送端和接收端( 两种切换方式,点对点,或者广播通讯)

tongzhengtong的博客 3329
上一篇: dsPIC(dsPIC30F4011) Bootloader原理及应用
下一篇: Android学习笔记4:关于handler以及它已过时的构造函数handler()
芯艺
博客等级 码龄21年 27粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值