android udp接收
大家讲道理
大家讲道理 2017-04-17 13:34:56
[Android讨论组]
address=InetAddress.getByName(url);
    int i=0;
    byte[] receiveByte = new byte[1316];
    Log.i("2015-6-3","thread running");
    dataPacket = new DatagramPacket(receiveByte, receiveByte.length);
    if(address==NULL)
    {
     try {
        dataSocket = new DatagramSocket(PORT);
    } catch (SocketException e1) {
        // TODO Auto-generated catch block
        Log.i("2015-6-3","port cannot open");
        e1.printStackTrace();
    }}else{
        try {
            dataSocket = new DatagramSocket(PORT,address);
        } catch (SocketException e1) {
            // TODO Auto-generated catch block
            Log.i("2015-6-8","port cannot open");
            e1.printStackTrace();
    }}
        while(true)
        {
            try {
                dataSocket.receive(dataPacket);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                Log.i("2015-6-3","packet receive failed");
                e.printStackTrace();
            }

相关代码如上,其中UDP只是监听端口,数据接收没有问题。但是加上IP就直接闪退到上一个activity,求解答。InetAddress.getByName(url)内的url是“239.255.x.x”格式的

----------分割线-------------
经过修改后的代码

    swi=1;
    try {
        dataaddr=new MulticastSocket(port);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        address = InetAddress.getByName(url);
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        dataaddr.joinGroup(address);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
try {
                    dataaddr.receive(dataPacket);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    Log.i("2015-6-3","packet receive failed");
                    e.printStackTrace();
                }.........

这时出现了一个bug,
W/ContextImpl( 1909): Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1168 com.android.internal.policy.impl.PhoneWindowManager.interceptKeyBeforeQueueing:4109 com.android.server.wm.InputMonitor.interceptKeyBeforeQueueing:357 com.android.server.input.InputManagerService.interceptKeyBeforeQueueing:1352 dalvik.system.NativeStart.run:-2

不知道有没有解,PS:VLC或者ffmpeg都是用c接收这种UDP包的

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(2)
PHP中文网
        MulticastSocket dataaddr=new MulticastSocket(1234);
        InetAddress address = InetAddress.getByName("239.0.0.1");
        dataaddr.joinGroup(address);
        byte[] receiveByte = new byte[1316];
        dataPacket = new DatagramPacket(receiveByte, receiveByte.length);
        try {
                    dataaddr.receive(dataPacket);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    Log.i("2015-6-3","packet receive failed");
                    e.printStackTrace();
                }

以上为解决办法,谢谢@huandu

黄舟

DatagramSocket(int aPort, InetAddress addr) 这里的 addr 只能绑定本机的 IP,你给的 IP 恐怕不是 Android 机器自己的 IP 吧。

如果 addr 不是本机 IP,new DatagramSocket(PORT,address) 会抛异常,从而导致 dataSocket == null,后面你在 dataSocket.receive 调用时没有捕捉 NullPointerException,所以直接挂掉了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号