我正在写一个基于nio的http服务器。我需要先收集完整客户端的请求,然后再将其传递给工作线程。
在SelectionKey.OP_READ中收集完整客户端请求的最佳方法是什么?
现在我正在考虑将ByteBuffer加到选择器的键上加倍:
while(keyIterator.hasNext()) {
...
if(key.isAcceptable()) {
...
key.attach(ByteBuffer.allocate(BUFFER_SIZE));
}
if(key.isReadable()) {
SocketChannel clientsc = (SocketChannel) key.channel();
ByteBuffer buffer = (ByteBuffer) key.attachment();
if(buffer.remaining() < MIN_BUFFER_SIZE) {
buffer = grow(buffer, BUFFER_SIZE * 2);
key.attach(buffer);
}
clientsc.read(buffer);
...
}
}
但这个解决方案看起来不是最优的。还有更好的方法吗?