Android发送和接收UDP广播

总结:IP地址、网络地址与子网掩码的理解 一、IP地址 电脑之间要实现网络通信,就必须要有一个合法的ip地址。IP地址=网络地址+主机地址,(又称:主机号和网络号组成) ip地址的结构使我们可以在Internet上很方便的寻址。ip地址通常用更直观的,以点分十进制表示,每个数字从0到255,如某一台主机的ip地址为:128.20.4.1。 在局域网里,同样也需要ip地址,一般内网的ip地址是以192.168开头的,这样很容易区分公网和内网的ip地址。 【注】网络地址也叫做网络位置、网络号、网段、子网IP,都是描述属于哪个子网的同义词。 【 阅读详情
AI摘要

本文介绍如何在Android平台上实现UDP广播通信。文章详细解释了广播地址的概念,并提供了发送和接收UDP广播的具体实现代码。

要实现在Android平台上发UDP广播,可能需要先了解一下什么是广播地址

广播地址

广播地址(Broadcast Address)是专门用于同时向网络中所有工作站进行发送的一个地址。在使用TCP/IP协议的网络中,主机标识端host ID 为全1的IP地址为广播地址,广播的分组传送给host ID段所涉及的所有计算机。例如,对于10.1.1.0(255.255.255.0)网段,其广播地址为10.1.1.255(255即为2进制的11111111),当发出一个目的地址为10.1.1.255的分组(封包)时,它将被分发给该网段上的所有计算机。

这里写图片描述
[图片来自百度百科]

广播地址有两类:

  • 受限广播
    它不被路由发送,但会被送到相同物理网络段上的所有主机,IP地址的网络字段和主机字段全为1就是地址255.255.255.255。
  • 直接广播
    网络广播会被路由发送,并会发送到专门网络上的每台主机,IP地址的网络字段定义这个网络,主机字段通常为全为1,如 192.168.10.255

关于广播地址的其他知识,大家可以自行搜索学习。

当我们知道有广播地址这个东西之后,就能很方便地在Android平台上实现发送广播和接收广播了。

一台Android作为Server端发送广播,那么此时的广播地址怎么确定,因为,作为Server端的手机可能是连接到一个路由器上,也有可能是自己作为AP设备发热点,让Client端去连接。对于以上的两种情况,广播地址是有所不同的:

  • 第一种情况(server端连接到路由器):见下面代码片段。
  • 第二种情况(server端作为AP设备发送热点):
    在这种情况下,IP也是可以确定,有人在分析Android源码的时候,发现如果Android设备开启了wifi热点,那么,该设备的本地IP是固定的,是192.168.43.1,那么我们就可以知道此时对应的广播地址就是192.168.43.255。

通过以下代码可以获取到本地IP(java)

    public static String getLocalIPAddress() {
        Enumeration<NetworkInterface> enumeration = null;
        try {
            enumeration = NetworkInterface.getNetworkInterfaces();
        } catch (SocketException e) {
            Logger.w(e);
        }
        if (enumeration != null) {
            // 遍历所用的网络接口
            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())) {
                            return ip.getHostAddress();
                        }
                    }
            }
        }
        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();
    }

通过以下代码可以直接获取广播地址,如果是打开wifi热点直接返回“192.168.43.255”(kotlin):

    companion object {
        fun getBroadcastAddress(context: Context): InetAddress {
            if (isWifiApEnabled(context)) { //判断wifi热点是否打开
                return InetAddress.getByName("192.168.43.255")  //直接返回
            }
            val wifi: WifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
            val dhcp: DhcpInfo = wifi.dhcpInfo ?: return InetAddress.getByName("255.255.255.255")
            val broadcast = (dhcp.ipAddress and dhcp.netmask) or dhcp.netmask.inv()
            val quads = ByteArray(4)
            for (k in 0..3) {
                quads[k] = ((broadcast shr k * 8) and 0xFF).toByte()
            }
            return InetAddress.getByAddress(quads)
        }

        /**
         * check whether the wifiAp is Enable
         */
        private fun isWifiApEnabled(context: Context): Boolean {
            try {
                val manager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
                val method = manager.javaClass.getMethod("isWifiApEnabled")
                return method.invoke(manager) as Boolean
            } catch (e: NoSuchMethodException) {
                e.printStackTrace()
            } catch (e: IllegalAccessException) {
                e.printStackTrace()
            } catch (e: InvocationTargetException) {
                e.printStackTrace()
            }
            return false
        }
    }

如果,广播地址能确定了,下面就可以进行实现发送广播(Server)和接收广播(Client)了

我们先定义一个通用的UDP广播类:包括(获取广播地址,打开和关闭广播、发送广播包和接收广播包)

UDPBroadcaster.kt:(kotlin)

class UDPBroadcaster(var mContext: Context) {
    private val TAG:String = UDPBroadcaster::class.java.simpleName
    private var mDestPort = 0
    private var mSocket: DatagramSocket? = null
    private val ROOT_PATH:String = Environment.getExternalStorageDirectory().path
    /**
     * 打开
     */
    fun open(localPort: Int, destPort: Int): Boolean {
        mDestPort = destPort
        try {
            mSocket = DatagramSocket(localPort)
            mSocket?.broadcast = true
            mSocket?.reuseAddress = true
            return true
        } catch (e: SocketException) {
            e.printStackTrace()
        }
        return false
    }

    /**
     * 关闭
     */
    fun close(): Boolean {
        if (mSocket != null && mSocket?.isClosed?.not() as Boolean) {
            mSocket?.close()
        }
        return true
    }

    /**
     * 发送广播包
     */
    fun sendPacket(buffer: ByteArray): Boolean {
        try {
            val addr = getBroadcastAddress(mContext)
            Log.d("$TAG addr",addr.toString())
            val packet = DatagramPacket(buffer, buffer.size)
            packet.address = addr
            packet.port = mDestPort
            mSocket?.send(packet)
            return true
        } catch (e1: UnknownHostException) {
            e1.printStackTrace()
        } catch (e: IOException) {
            e.printStackTrace()
        }
        return false
    }

    /**
     * 接收广播
     */
    fun recvPacket(buffer: ByteArray): Boolean {
        val packet = DatagramPacket(buffer, buffer.size)
        try {
            mSocket?.receive(packet)
            return true
        } catch (e: IOException) {
            e.printStackTrace()
        }
        return false
    }

    companion object {
        /**
         * 获取广播地址
         */
        fun getBroadcastAddress(context: Context): InetAddress {
            if (isWifiApEnabled(context)) { //判断wifi热点是否打开
                return InetAddress.getByName("192.168.43.255")  //直接返回
            }
            val wifi: WifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
            val dhcp: DhcpInfo = wifi.dhcpInfo ?: return InetAddress.getByName("255.255.255.255")
            val broadcast = (dhcp.ipAddress and dhcp.netmask) or dhcp.netmask.inv()
            val quads = ByteArray(4)
            for (k in 0..3) {
                quads[k] = ((broadcast shr k * 8) and 0xFF).toByte()
            }
            return InetAddress.getByAddress(quads)
        }

        /**
         * check whether the wifiAp is Enable
         */
        private fun isWifiApEnabled(context: Context): Boolean {
            try {
                val manager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
                val method = manager.javaClass.getMethod("isWifiApEnabled")
                return method.invoke(manager) as Boolean
            } catch (e: NoSuchMethodException) {
                e.printStackTrace()
            } catch (e: IllegalAccessException) {
                e.printStackTrace()
            } catch (e: InvocationTargetException) {
                e.printStackTrace()
            }
            return false
        }
    }
}

声明权限

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>

Server:

发送广播包(kotlin):


class MainActivity : AppCompatActivity(), View.OnClickListener {

    val TAG: String = MainActivity::class.java.simpleName
    val SEND_PORT: Int = 8008
    val DEST_PORT: Int = 8009
    var isClosed: Boolean = false
    var sendBuffer: String = "This is UDP Server"
    lateinit var mSendBtn: Button
    lateinit var mCloseBtn: Button
    lateinit var mScrollView: ScrollView
    lateinit var mLogTx: TextView
    lateinit var mUDPBroadCast: UDPBroadcaster
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mUDPBroadCast = UDPBroadcaster(this)
        initView()
        initEvent()
    }

    private fun initView() {
        mSendBtn = findViewById(R.id.btn_send) as Button
        mCloseBtn = findViewById(R.id.btn_close) as Button
        mScrollView = findViewById(R.id.scrollview) as ScrollView
        mLogTx = findViewById(R.id.log) as TextView
    }

    private fun initEvent() {
        mSendBtn.setOnClickListener(this)
        mCloseBtn.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        when (v?.id) {
            R.id.btn_send -> sendUDPBroadcast()
            R.id.btn_close -> closeUDPBroadcast()
        }
    }

    private fun closeUDPBroadcast() {
        isClosed = true
    }


    private fun sendUDPBroadcast() {
        isClosed = false
        mUDPBroadCast.open(SEND_PORT, DEST_PORT) //打开广播
        val buffer: ByteArray = sendBuffer.toByteArray()
        Thread(Runnable {
            while (!isClosed) {
                try {
                    Thread.sleep(500) //500ms 延时
                } catch (e: Exception) {
                    e.printStackTrace()
                }
                mUDPBroadCast.sendPacket(buffer) //发送广播包
                addLog("$TAG data: ${String(buffer)}")
            }
            mUDPBroadCast.close() //关闭广播
        }).start()
    }

    private fun addLog(log: String) {
        var mLog: String = log
        if (mLog.endsWith("\n").not()) {
            mLog += "\n"
        }
        mScrollView.post(Runnable {
            mLogTx.append(mLog)
            mScrollView.fullScroll(ScrollView.FOCUS_DOWN)
        })
    }
}

Client:

接收广播(kotlin):

class MainActivity : AppCompatActivity(), View.OnClickListener {

    val TAG:String = MainActivity::class.java.simpleName
    val LOCAL_PORT:Int = 8009
    val DEST_PORT:Int = 8008
    lateinit var mRecvBtn: Button
    lateinit var mCloseBtn: Button
    lateinit var mScrollView: ScrollView
    lateinit var mLogTx: TextView
    var isClosed:Boolean = false
    lateinit var mUDPBroadCaster:UDPBroadcaster
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mUDPBroadCaster = UDPBroadcaster(this)
        initView()
        initEvent()
    }

    private fun initEvent() {
        mRecvBtn.setOnClickListener(this)
        mCloseBtn.setOnClickListener(this)
    }

    private fun initView() {
        mRecvBtn = findViewById(R.id.btn_receive) as Button
        mCloseBtn = findViewById(R.id.btn_close) as Button
        mScrollView = findViewById(R.id.scrollView) as ScrollView
        mLogTx = findViewById(R.id.log) as TextView

    }
    override fun onClick(v: View?) {
        when(v?.id){
            R.id.btn_receive->recvUDPBroadcast()
            R.id.btn_close->cancelRecv()
        }
    }

    private fun cancelRecv() {
        isClosed = true
    }

    private fun recvUDPBroadcast() {
        isClosed = false
        mUDPBroadCaster.open(LOCAL_PORT,DEST_PORT)
        var buffer:ByteArray = kotlin.ByteArray(1024)
        val packet = DatagramPacket(buffer, buffer.size)
        Thread(Runnable {
            while (!isClosed){
                try{
                    Thread.sleep(500) //500ms延时
                }catch (e:Exception){e.printStackTrace()}
                mUDPBroadCaster.recvPacket(packet) //接收广播
                val data:String = String(packet.data)
                addLog("$TAG data: $data")
                addLog("$TAG addr: ${packet.address}")
                addLog("$TAG port: ${packet.port}")
            }
            mUDPBroadCaster.close() //退出接收广播
        }).start()
    }
    private fun addLog(log: String) {
        var mLog: String = log
        if (mLog.endsWith("\n").not()) {
            mLog += "\n"
        }
        mScrollView.post(Runnable {
            mLogTx.append(mLog)
            mScrollView.fullScroll(ScrollView.FOCUS_DOWN)
        })
    }
}

代码很少,也很容易看懂。发送和接收广播的截图如下:

  • Server

    这里写图片描述

  • Client

    这里写图片描述

源码下载地址

Demo(优快云下载)

Android广播--实现基于UDP协议通信 一、什么是UDP协议 我们最常听到的就是TCP与UDP的区别,首先要明白TCP/IP网络模型,TCP/IP是互联网相关的各类协议族的总称,之所以命名为tcp/IP,是因为TCP、IP协议是两个很重要的协议。 这些协议可划分为四层:数据链路层、网络层、传输层、应用层。 应用层:文件传输、电子邮件、文件服务、虚拟终端 超文本传输协议(HTTP):万维网的基本协议 远程登陆(Telnet):提供远程访问其它主机功能,允许用户登录internet主机,并在这台主机上执行命令 文件传输:TFTP(简单文件 阅读详情

相关推荐

Android UDP广播 客户端循环发送与接收

public class UdpBroadcast {private int iReceivePort = 0; //接收到消息的端口号private static final int TIMEOUT = 200; // 设置超时为200msprivate String udpresult; //服务器返回的消息/** * udp广播 */public String doUdpFind(Strin

Moes 4971

【计算机网络】IP地址和子网掩码的关系

了解IP地址扮演的角色有助于明白IP地址的含义乃至IP地址和子网掩码的关系 IP(Internet Protocol—网际互连协议),是TCP/IP体系中的网络层协议,它可以向传输层提供各种协议的信息,例如TCP、UDP等;对下可将IP信息包放到链路层。他最大的作用是网际互连,因此它是统一的国际标准,大家都按这一套来,网际中传输的额资源只有通过IP识别才能找到网关(局域网内部负责人),再通过网卡(MAC地址)进而定位到电脑。简单来说,IP就是位于网络层的一个通用的用来标识网络主机进行通讯的

尹煜的博客 7万+

安卓UDP接收广播数据

1、可先在oncreate()方法里面实例化一个WifiManager.MulticastLock 对象lock;具体如下:

qzs_13933908434的专栏 9455

网络:IP地址和子网掩码

1.分类的IP地址 整个互联网就是一个单一的,抽象的网络。IP地址就是给互联网上的每一台主机的每一个接口分配一个在全世界范围内是唯一的32位的标识符。 IP地址的编址方法经历过三个历史阶段: 分类的IP地址-&gt;子网的划分-&gt;构成超网 所谓“分类的IP地址”就是将IP地址划分为若干个固定类,每一类地址都是由两个固定长度的字段组成,其中第一个字段是网络号,标志主机所连接到的网络。第...

zjx624bjh的博客 4万+

Android如何在局域网中发送网络广播

Android如何在局域网中发送广播目前做的项目是当两个设备都接入一个Wifi热点后可以找到对方。如何找呢?大家一下子就会想到发送广播,对的就是发送广播。下面是一个实例如何发送一个UDP广播的例子。首先端口是事先约定好的,Android端代码: static void sendBroadCastToCenter(){ WifiManager wifiMgr = (WifiMan

kingroc的博客 1万+

安卓UDP接收数据 经常失败

WIFI芯片发送广播UDP数据给手机,经常出现安卓UDP接收数据 经常失败 解决方法: 1)WifiManager.MulticastLock 对象lock    失败,还是不行 一、有的手机不能直接接收UDP包,可能是手机厂商在定制Rom的时候把这个功能给关掉了。 1、可先在oncreate()方法里面实例化一个WifiManager.M

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 3310

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

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

tongzhengtong的博客 3329

实现Android UDP广播的示例教程

用户数据报协议(UDP)是一种无连接的网络协议,主要用于快速数据传输,不需要建立连接,数据包发送后无法保证一定会到达目的地。UDP因其低延迟和低开销的特性,在需要高响应速度的应用中被广泛使用。类是Java中用于网络通信的一种简便方式,它允许发送和接收数据包,主要通过UDP协议。UDP(用户数据报协议)是一种无连接的网络协议,这使得它在通信时不需要建立一个完整的连接,从而能够快速地发送数据。UDP不需要维护连接状态,因此在某些场景下,例如视频会议或在线游戏,它可以提供较低延迟的服务。

weixin_35756373的博客 1147

Android udp 广播发送和接收

最近在和同学开发一款app,作为课程大作业。其中,涉及到udp socket (多播) 的发送和接收、tcp socket 的发送和接收。作为一个Java的门外汉,在简单地看了一些理论地资料之后,实际编程中遇到了不少问题。然后,又在网上大搜这方面的博客,找来找去,其实大家写的东西基本都一样,因为规则已经订好了。网上的代码不全,又有一些错漏,让我走了很多弯路,无数次推倒代码重写,debug...

880

android 广播发送接收UDP

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

ABAP BAPI_PRODORD_CHANGE函数详解:如何高效重读生产订单主数据

本文深入解析ABAP BAPI_PRODORD_CHANGE函数在生产订单主数据高效处理中的应用。通过详细讲解函数架构、主数据重读机制及实战代码示例,帮助开发人员掌握生产订单数据的精准读取与更新技术,提升SAP系统集成与自动化处理效率。

weixin_29207149的博客 467

局域网下UDP广播发送与接收

局域网下UDP广播 发送与接收

LIENLIN的博客 7563

fpga的希尔伯特变换实现

fpga的希尔伯特变换实现零.实现背景一.希尔伯特实现的基本原理2.实现1)matlab仿真1)fpga滤波器实现实现成本:fpga实现采用VIvado的FIR的IP核, 零.实现背景 因为今明工作项目需要使用到希尔伯特变换来处理问题,所以顺便就把设计流程和代码都整理下来,以便供他人使用。选用Xilinx的7系列板子,Vivado平台。 一.希尔伯特实现的基本原理 希尔伯特变换的物理意义十分简单:...

weixin_42219690的博客 1万+

android 发送udp广播,Android UDP的两种广播方式

广播地址255.255.255.255和组播地址224.0.1.140单播”(Unicast)、“多播”(Multicast)和“广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在?1.单播:网络节点之间的通信就好像是人们之间的对话一样。如果一个人对另外一个人说话,那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个...

weixin_42122878的博客 2443

Tailscale 自建 DERP 中继服务器

Tailscale自建DERP中继服务器

Accompagner的博客 4328

MDT部署实战:除了Office,这些“装机必备”软件也能一键静默安装(含静默参数)

本文详细介绍了如何利用Microsoft Deployment Toolkit(MDT)实现企业级软件的静默安装,包括浏览器、开发工具和系统增强工具等“装机必备”软件的部署方案。通过命令行参数和MSI属性,IT运维团队可以高效构建标准化工作环境,提升部署效率并确保版本一致性。文章还提供了安装顺序控制、结果验证和常见问题排错等高级技巧。

weixin_26985923的博客 171

android:Udp广播/单播/组播的实现

广播 public class MainActivity extends AppCompatActivity { private Button sub_btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main5);

谢桥的博客 4726

Halcon 形态学 开发案例 (开运算opening(先腐蚀再膨胀)、闭运算closing(先膨胀再腐蚀))

算子方法:功能:使用用户自定义的结构元素对区域进行开运算参数: Region(输入参数) :输入区域 StructElement(输入参数) :结构元素(区域) RegionOpening(输出参数) :开运算后的区域功能:使用圆形结构元素对区域进行开运算参数: Region(输入参数) :输入区域 RegionOpening(输出参数) :开运算后的区域 Radius(输入参数) :圆形结构元素的半径功能:使用矩形结构元素对区域进行开运算。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1618

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

Altium Designer20 PCB板子绘制

版层 top layer 顶层 bottom layer 底层 设置板子大小 布局 过孔 top layer层连到bottom layer层。通过via连接。 设置线宽 在design rules里可以设置线宽。 右键new rule 可以新增线宽,电源设置成20mil 还可以设置很多其他的线宽 修改安全距离 安全距离太短容易出现毛刺,然后短路,一般设置成20mil 修改元器件旋转角度 修改rotation step,每次旋转45°。 修改光标大小 下面的cursor type是修改光标

及时总结 2581

中国国家级地面气象站基本气象要素日值数据集(V3.0)

气温数据TEM, 包括站点编号(sid), 纬度(lat), 经度(long), 高程(elev), 年(year), 月(month),日(day), 平均气温(tmean), 最高气温(tmax), 最低气温(tmin)气压数据PRS, 包括站点编号(sid), 纬度(lat), 经度(long), 高程(elev), 年(year), 月(month),日(day), 平均气压(pmean), 最高气压(pmax), 最低气压(pmin)中国国家级地面气象站基本气象要素日值数据集(V3.0)

J_Giser的博客 3892

android基于UDP协议发送数据的demo

最近在做一个基于TCP协议的项目,设备在对接第三方客户接口时,客户一个功能是基于UDP协议,这样设备还需要基于UDP协议完成数据发送。 故在此写了一个demo,demo分为两部分: Android基于UDP发送数据; 编写一个PC端服务,服务接收android设备发送来的UDP数据; Android端代码: private InetAddress mAddress......

IT熊的专栏 3784

全网详细解决Client does not support authentication protocol requested by server;consider upgrading Mysql c

全网详细解决1251 - Client does not support authentication protocol requested by server; consider upgrading Mysql client。

念兮为美 5477

UDP广播(可用于本机进程间通信)

一、有的手机不能直接接收UDP包,可能是手机厂商在定制Rom的时候把这个功能给关掉了。 1、可先在oncreate()方法里面实例化一个WifiManager.MulticastLock 对象lock;具体如下: WifiManager manager = (WifiManager) this .getSystemService(Context.WIFI_S

xuzidongsheng1234的博客 2336

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 发送UDP包和java应用程序来接听

转自:http://blog.sina.com.cn/s/blog_6c0a8fbb0100s3k5.html 我参考的博客中忘记说明需要在Manifest中加网络权限() android端代码: package com.example.sendudpbroadcasttest; import java.net.DatagramPacket; import java.net.Datag

xiaoxiaobian3310903的专栏 3510

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android udp通信需要什么权限

一、有的手机不能直接接收UDP包,可能是手机厂商在定制Rom的时候把这个功能给关掉了。 1、可先在oncreate()方法里面实例化一个WifiManager.MulticastLock 对象lock;具体如下: WifiManager manager = (WifiManager) this .getSystemService(Context.WIFI_SERVICE); WifiManager.MulticastLock lock= manager.createMulticastLock("test w

疾风剑豪 2358

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: android 静态注册广播注意事项
下一篇: java.lang.NoClassDefFoundError: Failed resolution of: Lokhttp3/internal/Platform
wujushan
博客等级 码龄11年 51粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值