Android在发送UDP数据包时引发异常

Android在发送UDP数据包时引发异常,android,udp,send,ping,Android,Udp,Send,Ping,我正在尝试向服务器发送UDP数据包,以查看它是否联机。我制作了一个独立的应用程序来实现这一点,它可以毫无问题地工作,但是当将代码放入应用程序并调用函数时,它会在实际发送数据包时抛出一个异常。我做了很多研究,但找不到任何原因。我用一个假的IP替换了这个IP,因为我不想发布实际的IP。感谢您在advanced中的帮助 import java.io.IOException; import java.net.*; import android.app.Activity; public class C

我正在尝试向服务器发送UDP数据包,以查看它是否联机。我制作了一个独立的应用程序来实现这一点,它可以毫无问题地工作,但是当将代码放入应用程序并调用函数时,它会在实际发送数据包时抛出一个异常。我做了很多研究,但找不到任何原因。我用一个假的IP替换了这个IP,因为我不想发布实际的IP。感谢您在advanced中的帮助

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

import android.app.Activity;

public class CheckStatus extends Activity {
//Check if the server is online

public static boolean check() {

    try {
        byte[] receiveData = new byte[1024];
        InetAddress address = InetAddress.getByName("11.11.11.11");
        //create socket
        DatagramSocket clientSocket = new DatagramSocket();
        //set timeout
        clientSocket.setSoTimeout(1000);
        //send packet

        DatagramPacket p = new DatagramPacket(Integer.toBinaryString(0x0006000000).getBytes(), 5, address, 44462);

        clientSocket.send(p);//throws exception here

        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        clientSocket.receive(receivePacket);
        clientSocket.close();
        return true;
    } catch (Exception e) {
        return false;
    }
}

}

打印异常时,我得到了“android.os.NetworkOnMainThreadException”

活动中声明此
asyncTask
,并从那里调用您的
check()
方法

编辑:

private class CheckStatusTask extends AsyncTask<Object, Object, Boolean> {        
    protected Boolean doInBackground(Object... arg0) {
        boolean flag = check();
        return flag;
    }

    protected void onPostExecute(Boolean flag) {
       // use your flag here to check true/false.
    }       
}
参考:


您正在捕获异常,但没有打印堆栈跟踪。。。你怎么知道出了什么问题?是的,对不起,我应该这么做。。我再次运行它,得到了这个“android.os.NetworkOnMainThreadException”很简单:自3.0+以来,android不在其主(UI)线程上进行联网。考虑使用分离的螺纹。并非如此简单:您希望从静态方法返回一个值。从线程中获取结果并不是最简单的任务。如果您将结果发布到UI,这将更容易(通过AsyncTask)。我认为它会执行它,但是我不太确定如何让它告诉我服务器是否响应。抱歉,我是android和UDP的新手。@user1998603查看我的编辑。这样,您就可以在
check()
方法执行完成后获得结果。因此,我首先让它工作,但一旦加载了新页面,它就表示它处于脱机状态。我所做的是在CheckStatusTask中创建一个名为“online”的私有变量,然后在onPostExecute中将online=设置为标志,并创建另一个名为getOnline()的函数,该函数返回布尔值online。因此,当我需要布尔值时,我只调用CheckStatusTask.getOnline(),它在第一次加载页面时起作用,但一旦加载新页面,它就会变为脱机
new CheckStatusTask().execute();