簡體   English   中英

Windows中Android的Java SocketChannel寫(ByteBuffer源)不同嗎?

[英]is Java SocketChannel write(ByteBuffer source) in Android different in windows?

當我在Android中調試代碼包含SocketChannel寫時,我得到了IllegalArgumentException,但是Windows中的相同代碼沒有此異常,Android和SocketChannel寫中的Windows之間是否有區別?

更新:(代碼是開源項目frostwire-android( 此文件位於github中 )的一部分,並且此部分與vuze 4.5相同,我只添加了一個try {})

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;     
}

行為是由同一合同(標准庫文檔)定義的,並且該文檔不能為任何實現特定的解釋留出空間,因此,對您的問題的答案必須是,不,Android上的行為與Windows上的行為。

順便說一句, 文檔沒有說該方法可能拋出IllegalArgumentException 您確定該方法引發了異常嗎? 我建議您為此提供SSCCE。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM