欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android的UDP编程实例

程序员文章站 2022-10-09 14:11:06
一、有的手机不能直接接收udp包,可能是手机厂商在定制rom的时候把这个功能给关掉了。1、可先在oncreate()方法里面实例化一个wifimanager.multica...
一、有的手机不能直接接收udp包,可能是手机厂商在定制rom的时候把这个功能给关掉了。
1、可先在oncreate()方法里面实例化一个wifimanager.multicastlock 对象lock;具体如下:
复制代码 代码如下:

wifimanager manager = (wifimanager) this
                .getsystemservice(context.wifi_service);
wifimanager.multicastlock lock= manager.createmulticastlock("test wifi");

2、在调用广播发送、接收报文之前先调用lock.acquire()方法;
3、用完之后及时调用lock.release()释放资源,否决多次调用lock.acquire()方法,程序可能会崩,详情请见
caused by: java.lang.unsupportedoperationexception: exceeded maximum number of wifi locks
注;记得在配置文件里面添加如下权限:
复制代码 代码如下:

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

经过这样处理后,多数手机都能正常发送接收到广播报文。
本小点转载自android手机接收不到udp报文
二、在udp通信中,android端发送udp广播包没有问题。至于接收的话,有时候不能接收到包。
在udp通信中,android端发送udp广播包没有问题。至于接收的话,有时候不能接收到包。但是如果udp包中指定了目标主机的地址的话,那么android端就能正常接收。
下面上一段代码,大家可用这段代码进行测试。
1、在一个service里面,我们创建一个线程
复制代码 代码如下:

public void oncreate() {//用于创建线程
        wifimanager manager = (wifimanager) this
                .getsystemservice(context.wifi_service);
        udphelper = new udphelper(manager);

        //传递wifimanager对象,以便在udphelper类里面使用multicastlock
        udphelper.addobserver(msgreceiveservice.this);
        treceived = new thread(udphelper);
        treceived.start();
        super.oncreate();
    }

2、弄一个udp帮助类,这个类主要用于发送和接收数据
复制代码 代码如下:

package com.example.com.ihome.bang.util;
import java.io.ioexception;
import java.net.datagrampacket;
import java.net.datagramsocket;
import java.net.inetaddress;
import java.net.multicastsocket;
import java.net.socketexception;
import java.net.unknownhostexception;
import java.util.observable;
import com.example.com.ihome.bang.tool.sendthread;
import android.net.wifi.wifimanager;
import android.util.log;
/**
 *
 * udphelper帮助类
 *
 * @author 陈喆榕
 *
 */
public class udphelper  implements runnable {
    public    boolean isthreaddisable = false;//指示监听线程是否终止
    private static wifimanager.multicastlock lock;
    inetaddress minetaddress;
    public udphelper(wifimanager manager) {
         this.lock= manager.createmulticastlock("udpwifi");
    }
    public void startlisten()  {
        // udp服务器监听的端口
        integer port = 8903;
        // 接收的字节大小,客户端发送的数据不能超过这个大小
        byte[] message = new byte[100];
        try {
            // 建立socket连接
            datagramsocket datagramsocket = new datagramsocket(port);
            datagramsocket.setbroadcast(true);
            datagrampacket datagrampacket = new datagrampacket(message,
                    message.length);
            try {
                while (!isthreaddisable) {
                    // 准备接收数据
                    log.d("udp demo", "准备接受");
                     this.lock.acquire();

                    datagramsocket.receive(datagrampacket);
                    string strmsg=new string(datagrampacket.getdata()).trim();
                    log.d("udp demo", datagrampacket.getaddress()
                            .gethostaddress().tostring()
                            + ":" +strmsg );this.lock.release();
                }
            } catch (ioexception e) {//ioexception
                e.printstacktrace();
            }
        } catch (socketexception e) {
            e.printstacktrace();
        }
    }
    public static void send(string message) {
        message = (message == null ? "hello ideasandroid!" : message);
        int server_port = 8904;
        log.d("udp demo", "udp发送数据:"+message);
        datagramsocket s = null;
        try {
            s = new datagramsocket();
        } catch (socketexception e) {
            e.printstacktrace();
        }
        inetaddress local = null;
        try {
            local = inetaddress.getbyname("255.255.255.255");
        } catch (unknownhostexception e) {
            e.printstacktrace();
        }
        int msg_length = message.length();
        byte[] messagebyte = message.getbytes();
        datagrampacket p = new datagrampacket(messagebyte, msg_length, local,
                server_port);
        try {
            s.send(p);
            s.close();

        } catch (ioexception e) {
            e.printstacktrace();
        }
    }
    @override
    public void run() {
            startlisten();
    }
}