【问题标题】:Android - Socket time outAndroid - 套接字超时
【发布时间】:2010-10-18 19:38:51
【问题描述】:

我有一些奇怪的套接字行为。我使用 setSoTimeout 设置了 5 秒的超时。在我的情况下,这应该有足够的时间。根据在线 java 文档,如果超时,应该抛出 SocketTimeoutException。它还说套接字仍然有效。所以我想抓住它然后继续。但是,外部捕获 IOException 不是内部捕获,而是捕获异常,当我将详细信息输出到日志时,它说它是 SocketTimeoutException。另一个令人困惑的事情是,我将超时时间从 5 秒更改为 15 秒,并记录每次读取所需的时间,时间始终在毫秒范围内,甚至从未接近一秒。任何想法都非常感谢。

ReadThread代码sn-p

@Override
public void run()
{
    try
    {
        while (true)
        {
            byte[] sizeBuffer = new byte[BYTES_FOR_MESSAGE_SIZE];

            int bytesRead = this.inputStream.read(sizeBuffer);

            int length = 0;

            for (int i = 0; i < BYTES_FOR_MESSAGE_SIZE; i++)
            {
                int bitsToShift = 8 * i;
                int current = ((sizeBuffer[i] & 0xff) << bitsToShift);
                length = length | current;
            }

            byte[] messageBuffer = new byte[length];


            this.socket.setSoTimeout(5000); //5 second timeout

            try
            {
               this.inputStream.read(messageBuffer);
            }
            catch(java.net.SocketTimeoutException ste)
            {
               Log.e(this.toString(), "---- SocketTimeoutException caught ----");
               Log.e(this.toString(), ste.toString());
            }

        }
    }
    catch (IOException ioe)
    {
       Log.e(this.toString(), "IOException caught in ReadThread");
       Log.e(this.toString(), ioe.toString());
       ioe.printStackTrace();
    }
    catch (Exception e)
    {
       Log.e(this.toString(), "Exception caught in ReadThread");
       Log.e(this.toString(), e.toString());
       e.printStackTrace();
    }

    this.interfaceSocket.socketClosed();

}// end run

【问题讨论】:

    标签: java android sockets


    【解决方案1】:

    我同意布赖恩的观点。您可能会在第一次读取时超时,而不是第二次。设置的超时将一直有效,直到您再次更改它。

    您读取“消息”的第二次读取调用似乎假设 (a) 它将读取整个消息,并且 (b) 如果整个消息未在 5 秒内到达,它将超时。它不是那样工作的。如果 nothing 在 5 秒内到达,它将超时, 否则它将读取已到达的任何内容,直到 message.length。但它只能是一个字节。

    您应该使用DataInputStream.readFully() 来阅读整个消息,并且您需要彻底重新考虑您的超时策略。

    【讨论】:

      【解决方案2】:

      由于之前调用了 this.inputStream.read(),异常可能在第一次 try catch 中被捕获。您有两个这样的调用:一个在外部尝试中,一个在内部尝试中。

      您是否验证了是否正在读取数据?如果正在读取数据,那么您应该期望读取操作在几毫秒后返回。如果未读取数据,则读取操作应在您指定的时间内阻塞在那里。也许这与您设置SoTimeout 的顺序有关(也许早点这样做会有所帮助)。

      祝你好运, B-Rad

      【讨论】:

        猜你喜欢
        • 2012-11-17
        • 2016-10-02
        • 2012-10-03
        • 2012-11-25
        • 2014-07-05
        • 2012-04-24
        • 2011-07-31
        • 1970-01-01
        相关资源
        最近更新 更多