【问题标题】:Android UDP socket sends data only once?Android UDP套接字只发送一次数据?
【发布时间】:2012-04-26 14:03:53
【问题描述】:

我是编写 Android 应用程序的新手,我想编写一段代码,以定期(例如 1 秒)广播传感器数据。搜索开源代码,我设法编写了一个发送者类,如下所示:

public class Sender extends Thread {
    private static final String TAG = "Sending";
    private static final int PORT = 12346;
    private static final int TIMEOUT_MS = 500;
    private static final int BUF_SIZE = 1024;
    private WifiManager mWifi;

    Sender(WifiManager wifi) {
        mWifi = wifi;
    }

    public void run() {
        try {
            DatagramSocket socket = new DatagramSocket(PORT);
            socket.setBroadcast(true);
            socket.setSoTimeout(TIMEOUT_MS);
            sendData(socket);
            socket.close();
            Thread.sleep(1000);
        }
        catch (IOException ioe) {
            Log.e(TAG, "Couldn't send data", ioe);
        } 
        catch (InterruptedException ie) {
            Log.e(TAG,  "Can't sleep", ie);
        }
    }

    private void sendData(DatagramSocket socket) throws IOException {
        byte[] buf = new byte[BUF_SIZE];
        buf = object.toString().getBytes();
        InetAddress addr = InetAddress.getByName("192.168.0.255"); // TO FIX
        DatagramPacket packet = new DatagramPacket(buf, buf.length, addr, PORT);
        socket.send(packet);
    }

    public void main(String[] args) {
        new Sender(null).start();
        while (true) {
        }
    }
}

下面是我从 onCreate 方法中启动它的方法:

public void onCreate(Bundle savedInstanceState) {
...

    new Sender((WifiManager) getSystemService(Context.WIFI_SERVICE)).start();
...
}

现在,如果我在笔记本电脑上打开 Wireshark,我只会看到应用程序启动时发送的一个数据包,而不是每秒钟发送一次。

谁能指出我哪里做错了?老实说,我对线程和东西不是很熟悉,所以我可能只是在这里遗漏了一些明显的东西......

编辑

好的,所以 run 方法必须循环。请参阅以下答案中的更正代码。

【问题讨论】:

  • while添加到run,否则发送一个数据包后线程结束。 main 方法也没有用,因为它从未被调用过。
  • T_T 你说得对!现在完成了,请参见上面的编辑...非常感谢,对于菜鸟问题​​很抱歉...
  • 张贴更正的答案作为答案并接受它,以便将来更容易找到。
  • 当然。我会接受它,一旦我被允许这样做:)

标签: android multithreading sockets udp


【解决方案1】:

以下是更正后的运行方法代码:

public void run() {
            while (true) {
                try {
                    DatagramSocket socket = new DatagramSocket(PORT);
                    socket.setBroadcast(true);
                    socket.setSoTimeout(TIMEOUT_MS);
                    sendData(socket);
                    socket.close();
                    Thread.sleep(1000);
                }
                catch (IOException ioe) {
                    Log.e(TAG, "Couldn't send data", ioe);
                } 
                catch (InterruptedException ie) {
                    Log.e(TAG,  "Can't sleep", ie);
                }
            }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多