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方法必須循環。在下面的答案中查看更正的代碼。
添加'while'到'run'否則線程發送一個數據包後結束。 'main'方法也是無用的,因爲它永遠不會被調用。 – zapl 2012-04-14 13:07:51
T_T你絕對是對的!現在完成了,請參閱上面的編輯...非常感謝,對於noob問題感到抱歉... – herrfz 2012-04-14 13:20:33
發佈更正後的答案並接受答案,以便將來更容易找到答案。 – FoamyGuy 2012-04-14 13:43:05