2012-04-14 45 views
0

我对编写Android应用程序相当陌生,并且我想写一段代码来定期传播传感器数据,比如说1秒。搜索开源代码,我设法写如下发件人类:Android的UDP套接字只发送一次数据?

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的我的笔记本电脑,我只看到一个数据包在应用程序启动时发送,而不是每秒发送一次。

有人请指出我做错了什么地方吗?老实说,我没那么熟悉线程和东西,所以我可能只是缺少明显的东西在这里...

编辑

OK,所以run方法必须循环。在下面的答案中查看更正的代码。

+0

添加'while'到'run'否则线程发送一个数据包后结束。 'main'方法也是无用的,因为它永远不会被调用。 – zapl 2012-04-14 13:07:51

+0

T_T你绝对是对的!现在完成了,请参阅上面的编辑...非常感谢,对于noob问题感到抱歉... – herrfz 2012-04-14 13:20:33

+0

发布更正后的答案并接受答案,以便将来更容易找到答案。 – FoamyGuy 2012-04-14 13:43:05

回答

2

这里的修正run方法代码:

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); 
       } 
      } 
} 
相关问题