0

我正在编写一个非阻塞客户端,它使用选择器SelectionKey.OP_READselector.select()调用从网络套接字读取数据。阅读部分是这样处理的:

if (selectionKey.isReadable()) {
    int len = inChannel.read(buf);
    System.out.println(len);
    . . .
}

我看到的问题是读取大小(len)随着下载的进行逐渐退化:

1290
1290
1290
480
318
28
28
28
28
28
28
28
28
28
28
28
28
28

有谁知道这是为什么以及如何改进它?当然,它按原样工作,但我需要减少 cpu 开销,因此最好处理大块而不是小块。添加一个小的睡眠(20 毫秒)会有所帮助,但显然会限制可伸缩性,因为我需要同时处理数千个流。

4

1 回答 1

0

来回答我自己的问题...

没关系;我没有正确使用缓冲区。compact()从缓冲区读取后忘记调用。

if (selectionKey.isReadable()) {
    int len = inChannel.read(buf);
    System.out.println(len);
    . . .
    buf.flip();
    // ... read from buf ...
    buf.compact();
}

显然缓冲区不是循环的;即使缓冲区是空的,也必须在下次使用之前重置位置和限制。

于 2012-07-11T08:51:26.720 回答