奇怪的失败在ServerResource中获取1024 * 12 + 486长度响应

时间:2013-09-22 16:27:19

标签: restlet

我在下面用restlet-android-2.1.4写了一个ServerResource。如果我将SIZE设置为1024 * 12 + 485,则可以正常工作。但是,如果我将SIZE更改为1024 * 12 + 486,则此句柄将处于待处理状态。

public class DataResource extends ServerResource {    
    public static final int SIZE = 1024 * 12 + 485;
    @Get
    public Representation getResource(Representation entity) {
        return new OutputRepresentation(MediaType.ALL) {
            @Override
            public void write(OutputStream outputStream) throws IOException {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < SIZE; i++) {
                    sb.append('E');
                }
                outputStream.write(sb.toString().getBytes());
                outputStream.close();
            }
        };
    }
}

1 个答案:

答案 0 :(得分:0)

深入了解代码,更改WritableSocketChannel.java中的write函数(在restlet源代码中),它将起作用。 我不知道这是不是一个错误。

来自

public int write(ByteBuffer src) throws IOException {
    return getWrappedChannel().write(src);
}

public int write(ByteBuffer src) throws IOException {
    int count = 0;
    while (src.hasRemaining()) {
        count += getWrappedChannel().write(src);
    }
    return count;
}

根据java doc

  

某些类型的频道,根据其状态,可能只能写入   一些字节或可能根本没有。一个套接字通道   例如,非阻塞模式不能写任何更多的字节   在套接字的输出缓冲区中释放。