当前位置: 移动技术网 > IT编程>移动开发>Android > android的UDP编程实例

android的UDP编程实例

2019年07月24日  | 移动技术网IT编程  | 我要评论

数码达人,必赢haobc,n0477

一、有的手机不能直接接收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();
    }
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网