gpt4 book ai didi

java - 如何在处于接收状态时关闭 DatagramSocket

转载 作者:行者123 更新时间:2023-11-30 11:23:41 27 4
gpt4 key购买 nike

在我的 Android 应用程序中,我发送了 UDP 数据包,并使用此代码等待特定的数据包。当它到达时,我不需要再听了。但是,它处于“接收模式”,当我调用 socket.close() 时,它会抛出异常。我应该以某种方式阻止它。

如何无异常停止接收?

socket.send(packet);
Log.d(Tags.DEBUG, "Sent");
while (shouldRunning)
{
byte[] buf = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(buf, buf.length);
Log.d(Tags.DEBUG, "Receive start");
//if (socket != null && !socket.isClosed())
{
socket.receive(packet2);
Log.d(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 closed
at org.apache.harmony.luni.platform.OSNetworkSystem.recv(NativeMethod) atdalvik.system.BlockGuard$WrappedNetworkSystem.recv(BlockGuard.java:321)atorg.apache.harmony.luni.net.PlainDatagramSocketImpl.doRecv(PlainDatagramSocketImpl.java:172)atorg.apache.harmony.luni.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:181)at java.net.DatagramSocket.receive(DatagramSocket.java:402)
at com.example.Data.DataAsyncTask.Networking(DataAsyncTask.java:745)

最佳答案

你应该在套接字上设置超时:

socket.setSoTimeout(1000);

SocketTimeoutException 上继续 while 循环。完成后,shouldRunning==true 在 while 循环终止后关闭套接字。

OnCancelled() 应该只设置标志。

关于java - 如何在处于接收状态时关闭 DatagramSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21047475/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com