Java SocketChannel запись (источник ByteBuffer) в Android отличается в Windows? - PullRequest
0 голосов
/ 12 марта 2012

Когда я отлаживаю код, содержащий запись SocketChannel в Android, я получаю IllegalArgumentException, но тот же код в окнах не исключение, есть ли разница между Android и окнами в записи SocketChannel?

ОБНОВЛЕНИЕ: (код является частью проекта с открытым исходным кодом frostwire-android ( этот файл в github ), и эта часть такая же, как vuze 4.5, я просто добавляю попытку {})

private int channelWrite(ByteBuffer buf) throws IOException
{
    int written = 0;
    while(remainingBytesToScatter > 0 && buf.remaining() > 0)
    {
        int currentWritten = 0;
        try{
            currentWritten = channel.write((ByteBuffer)(buf.slice().limit(Math.min(50+rnd.nextInt(100),buf.remaining()))));
        }catch( Exception e ) {
            if(e instanceof IOException) {
                Log.d("", "chanel write IOException " + e.getMessage());
            }else if(e instanceof IOException) {
                Log.d("", "chanel write AsynchronousCloseException " + e.getMessage());
            }else if(e instanceof ClosedByInterruptException) {
                Log.d("", "chanel write ClosedByInterruptException " + e.getMessage());
            }else if(e instanceof ClosedChannelException) {
                Log.d("", "chanel write ClosedChannelException " + e.getMessage());
            }else if(e instanceof NotYetConnectedException) {
                Log.d("", "chanel write ClosedChannelException " + e.getMessage());
            }else {
                // while in second time, reach here
                Log.d("", "chanel write unknown " + e.getMessage());
            }
        }

        if(currentWritten == 0)
            break;
        buf.position(buf.position()+currentWritten);
        remainingBytesToScatter -= currentWritten;
        if(remainingBytesToScatter <= 0)
        {
            remainingBytesToScatter = 0;
            try
            {
                channel.socket().setTcpNoDelay(false);
            } catch (SocketException e)
            {
                Debug.printStackTrace(e);
            }
        }
        written += currentWritten;
    }

    if(buf.remaining() > 0)
        written += channel.write(buf);

    return written;     
}

1 Ответ

0 голосов
/ 12 марта 2012

Поведение определяется тем же договором (стандартной библиотечной документацией), и эта документация не дает места для каких-либо специфических интерпретаций реализации, поэтому ответ на ваш вопрос должен быть, нет, не должно быть никакой разницы между поведением на Android и поведение в Windows.

Кстати, документация не говорит о том, что метод может выдать IllegalArgumentException. Вы уверены, что исключение выдается из этого метода? Я предлагаю вам предоставить SSCCE для этого.

...