2012-04-14 44 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); 
       } 
      } 
} 
相關問題