我创建了一个运行后台服务的 android 应用程序,该服务执行以下操作:
1) 要求 UDP 服务器向其发送 100 个数据包
2) 在 while(true) 循环中接收数据包
3) 使用 setSoTimeout 使接收在 5 分钟后超时并退出循环
上述操作每 2 分钟重复一次。当手机连接到 PC 并使用 adb logcat 监控每一步时,该应用程序运行良好,但当手机与 PC 断开连接时,该应用程序停止工作。然后在文件中记录每个步骤表明最后一步是接收步骤,之后套接字不会超时。可能的原因是什么?有没有其他方法可以让我以恒定的时间间隔完成预期的任务?这是从服务启动的线程的运行函数:
public void downlink()
{
String path = extStorageDirectory + "/" + appFolder + "/REP_DT_" + Long.toString(System.currentTimeMillis()) + ".txt";
File file = new File(path);
if(!file.exists())
try
{
file.createNewFile();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
String p = extStorageDirectory + "/Goonj/logtput.txt";
try {
DatagramSocket clientSocket = new DatagramSocket();
try {
FileWriter fw = new FileWriter(path,true);
fw.write("\n\n");
fw.close();
clientSocket.setSoTimeout(120000);
InetAddress IPAddress = InetAddress.getByName(IP);
long id = System.currentTimeMillis();
byte[] sendData = createMessage(id,0,1400,150);
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9010);
clientSocket.send(sendPacket);
byte[] receiveData = new byte[10240];
boolean flag = true;
while(flag)//for(int i=0; i<100; i++)
{
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
writeToLog(p,"START");
clientSocket.receive(receivePacket);
writeToLog(p,"END");
long time = System.currentTimeMillis();
String data = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println(data);
fw = new FileWriter(path,true);
fw.write(Long.toString(getSeqno(data)) + " " + Long.toString(time) + "\n");
fw.close();
}
}
catch(SocketTimeoutException e)
{
writeToLog(p,"SOCKET EXCEPTION HAS BEEN CAUGHT!!!" + Long.toString(System.currentTimeMillis()));
e.printStackTrace();
}
catch(IOException e)
{
writeToLog(p,"IO EXCEPTION HAS BEEN CAUGHT!!!" + Long.toString(System.currentTimeMillis()));
e.printStackTrace();
}
clientSocket.close();
}
catch(SocketException e){}
//fw.close();
}