在我的Android应用程序中,我发送UDP数据包,并使用此代码等待特定的一个。当它到达时,我不再需要听了。但是,它处于“接收模式”,当我调用socket.close()时,它会抛出异常。不知怎的,我应该阻止它。
如何在没有例外的情况下停止接收?
socket.send(packet);
Log.w(Tags.DEBUG, "Sent");
while (shouldRunning)
{
byte[] buf = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(buf, buf.length);
Log.w(Tags.DEBUG, "Receive start");
//if (socket != null && !socket.isClosed())
{
socket.receive(packet2);
Log.w(Tags.DEBUG, "ADDR" + packet2.getAddress().toString());
String data = String.valueOf(packet2.getData());
Log.w(Tags.DEBUG, "Data: " + data);
if (data.equals(Tags.SPEC1))
shouldRunning= false;
}
//else
//shouldRunning= false;
}
我以这种方式关闭套接字:
@Override
protected void onCancelled()
{
if (socket != null)
{
//socket.disconnect();
shouldRunning=false;
socket.close();
socket = null;
}
}
我得到了这个例外:
java.net.SocketException:Socket关闭了 在org.apache.harmony.luni.platform.OSNetworkSystem.recv(Native 方法)at dalvik.system.BlockGuard $ WrappedNetworkSystem.recv(BlockGuard.java:321) 在 org.apache.harmony.luni.net.PlainDatagramSocketImpl.doRecv(PlainDatagramSocketImpl.java:172) 在 org.apache.harmony.luni.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:181) 在java.net.DatagramSocket.receive(DatagramSocket.java:402)
在com.example.Data.DataAsyncTask.Networking(DataAsyncTask.java:745)
答案 0 :(得分:1)
你应该在套接字上加一个超时:
socket.setSoTimeout(1000);
在SocketTimeoutException
上继续while循环。完成后shouldRunning==true
在while循环终止后关闭套接字。
OnCancelled()
应该只设置标志。