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

时间:2014-01-10 14:59:34

标签: java android sockets

在我的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)

1 个答案:

答案 0 :(得分:1)

你应该在套接字上加一个超时:

socket.setSoTimeout(1000);

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

OnCancelled()应该只设置标志。