【问题标题】:Android throws exception when sending UDP packetAndroid在发送UDP数据包时抛出异常
【发布时间】:2013-01-05 03:12:02
【问题描述】:

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

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”

【问题讨论】:

  • 您正在捕获异常但没有打印出堆栈跟踪...您应该如何知道出了什么问题?
  • 是的,很抱歉应该这样做......我再次运行它并得到了这个“android.os.NetworkOnMainThreadException”
  • 简单:自 3.0+ 起,Android 不再在其主 (UI) 线程上进行网络连接。考虑使用单独的线程。不是那么简单:您想从静态方法返回一个值。从线程中获取结果并不是最简单的任务。 如果您将结果发布到 UI,这会更容易(通过 AsyncTask)。

标签: android udp send ping


【解决方案1】:

activity 中声明这个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.
    }       
}

然后打这个电话:

new CheckStatusTask().execute();

参考:

Painless threading

【讨论】:

  • 我认为它正在执行它但是我不太确定如何让这个告诉我服务器是否响应。抱歉,我是 android 和 UDP 新手。
  • @user1998603 查看我的编辑。这样您就可以在check() 方法执行完成后获得结果。
  • 所以我一开始可以使用它,但是一旦加载了新页面,它就会说它离线。我所做的是在 CheckStatusTask 中创建了一个名为“online”的私有变量,然后在 onPostExecute 中我将 online = 设置为标记并创建了另一个名为 getOnline() 的函数,该函数返回了在线布尔值。因此,当我需要布尔值时,我只需调用 CheckStatusTask.getOnline(),它适用于第一页加载,但一旦我加载新页面,它就会变为离线
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
相关资源
最近更新 更多