无法在 Android 应用程序上接收 UDP 字节

Failing to recieve UDP byte on Android app

我正在编写一个 android 应用程序来接收在网络广播地址上广播的数据包(这已经过测试,数据包确实得到广播并在 "UDP Sender/Receiver" 应用程序。)我无法让我的应用程序接收它并告诉我它存在。这些设备在同一个网络上,发送设备的代码正在运行并且是专有的。这是应用程序的基本 DatagramSocket 代码。

    package com.ti.cc3x.android;

import java.io.IOException;
import java.net.*;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class buttonListener extends Activity {

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listener);
        final TextView txt = (TextView)findViewById(R.id.txt1);


     new Thread( new Runnable(){
         public void run(){


                    try {
                        String text = null;
                        int server_port = 12356;
                        byte[] message = new byte[66];
                        DatagramPacket p = new DatagramPacket(message, message.length);
                        DatagramSocket s = new DatagramSocket(server_port);


                        while(text == null){
                        s.receive(p);
                        text = new String(message, 0, p.getLength());
                        txt.setText("Messed up.");
                        }

                        if(text != null){
                        Toast.makeText(buttonListener.this, text, Toast.LENGTH_LONG).show();
                        txt.setText("Received");
                        s.close();
                        }

                    }
                    catch (SocketException se) {
                        se.printStackTrace();
                        Toast.makeText(buttonListener.this, "Socket Error", Toast.LENGTH_LONG).show();
                        txt.setText("Socket Error");
                    }
                    catch (IOException ioe) {
                        ioe.printStackTrace();
                        Toast.makeText(buttonListener.this, "Network Error", Toast.LENGTH_LONG).show();
                        txt.setText("Network Error");
                    }

                 }
         }).start();

}}

感谢任何帮助,谢谢!!

更新代码:

package com.ti.cc3x.android;

import java.io.IOException;
import java.net.*;
import java.util.Arrays;

import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.MulticastLock;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class buttonListener extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listener);
        WifiManager wifi = (WifiManager)
        getSystemService(Context.WIFI_SERVICE);
        WifiManager.MulticastLock lock = wifi.createMulticastLock("Log_Tag");
        final TextView txt = (TextView) findViewById(R.id.txt1);
        lock.acquire();

    new Thread( new Runnable(){
        public void run(){


                   try {
                       String text = null;
                       int server_port = 12356;
                       byte[] message = new byte[66];
                       DatagramPacket p = new DatagramPacket(message, message.length);
                       DatagramSocket s = new DatagramSocket(server_port);


                       //while(text == null){
                       s.receive(p);
                       text = new String(message, 0, p.getLength());
                       txt.setText("Messed up.");
                       //}

                       //if(text != null){
                       Toast.makeText(buttonListener.this, text, Toast.LENGTH_LONG).show();
                       txt.setText("Received");
                       s.close();
                       //}

                   }
                   catch (SocketException se) {
                       se.printStackTrace();
                       Toast.makeText(buttonListener.this, "Socket Error", Toast.LENGTH_LONG).show();
                       txt.setText("Socket Error");
                   }
                   catch (IOException ioe) {
                       ioe.printStackTrace();
                       Toast.makeText(buttonListener.this, "Network Error", Toast.LENGTH_LONG).show();
                       txt.setText("Network Error");
                   }

                }
        }).start();




    lock.release();
    }
    }

在您的回答中,您提到正在广播您发送的测试包。您是否尝试过将数据包直接发送到您设备的 IP 地址而不是广播它是否可以收到数据包?您的套接字有可能工作正常,但只是收不到广播数据包。默认情况下,Android Wi-Fi 堆栈会过滤掉多播数据包以节省电量。如果您可以接收直接发送到您的 IP 地址的数据包,那么这意味着您所要做的就是通过获取 MulticastLock 来启用多播数据包的接收,您可以在此处找到更多信息:Android device not receiving multicast package

如果您仍然无法收到直接数据包,则可能是另一个问题,但我会先检查一下。