如果从selector里面接到readable key以后,读完了以后直接写出去还不将它改成writable这样好吗?
比如:public void read(SelectionKey key) throws IOException {
SocketChannel clntChan = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(128);
clntChan.read(buffer);
buffer.flip();
clntChan.write(buffer);
}
这样直接把信息echo回去,而不通过把它改成writable,所以整个过程不判断有没有writable的key。如果要是发给指定channel的话可以直接从一个collection里面调出这个channel然后写出去,请问这样做法的利弊。javanio
比如:public void read(SelectionKey key) throws IOException {
SocketChannel clntChan = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(128);
clntChan.read(buffer);
buffer.flip();
clntChan.write(buffer);
}
这样直接把信息echo回去,而不通过把它改成writable,所以整个过程不判断有没有writable的key。如果要是发给指定channel的话可以直接从一个collection里面调出这个channel然后写出去,请问这样做法的利弊。javanio
2. read这个selector先检查缓存队列中是否有bytebuffer,如果有,将当前要写的加入队列末尾,如果没有,直接调用channel.write,并查看返回值,如果等于buffer.remaining(要在write之前取这个值),表示完全写入,否则加入队列
3. 整个过程要加锁
1是要用两个selector一个write一个read吗
2什么是队列中有butebuffer?
这样会造成read进来的一个buffer分两次write出去吗?如果这样的话接受的client那边还要在接受的完整性上做处理?