在socket.receive(数据包)上中断线程;抛出错误

时间:2012-07-04 08:33:37

标签: java android multithreading sockets

我正在开发一个使用此线程运行服务的Android 3.1 Tablet应用程序:

public class UDPServerThread extends Thread
{
    [ ... ]

    public void run()
    {
        while (!end)
        {
            try
            {
                byte[] buf = new byte[MESSAGE_SIZE];

                // Wait an incoming message.
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
                socket.receive(packet);
                // TODO: Notify Service with packet received
                Message msg = new Message();
                msg.obj = packet;
                mServiceHandler.sendMessage(msg);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    public void stopServer()
    {
        Log.v("UDPServerThread", "stopServer");
        if (socket != null)
            socket.close();
        end = true;
    }
}

当我从服务中调用stopServer()方法时,我收到以下错误:

java.net.SocketException: Interrupted system call

这个帖子在socket.receive(packet);上停止的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

根据javadoc of the close method

  

此套接字上的I / O操作中当前阻塞的任何线程都将抛出SocketException。

因此,当您致电closesocket.receive(packet);时,如果它当前处于阻止模式,则会抛出SocketException阻塞在catch (IOException e)块中,并且堆栈跟踪是打印。

答案 1 :(得分:3)

此异常的唯一真正问题是您无法轻易将其与实际I / O错误区分开来。我建议切换到使用SocketChannel而不是Socket - 然后你可以中断你的服务器线程,它会抛出一个ClosedByInterruptException,你可以专门捕获和处理它。