if (key.isAcceptable()) { // 接收请求
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel channel = server.accept();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) { // 读信息
SocketChannel channel = (SocketChannel) key.channel();
int count = channel.read(clientBuffer);
if (count > 0) {
clientBuffer.flip();
CharBuffer charBuffer = decoder.decode(clientBuffer);
System.out.println("Client >>" + charBuffer.toString());
SelectionKey wKey = channel.register(selector,
SelectionKey.OP_WRITE);
SelectionKey skTest = wKey.interestOps(SelectionKey.OP_WRITE);
}
问一下 :
SelectionKey wKey = channel.register(selector,SelectionKey.OP_WRITE);
SelectionKey skTest = wKey.interestOps(4);
这两句话的作用有什么区别?
Server端是通过什么知道一个channel的数据已经全部写到clientBuffer里面了(因为read 方法不堵塞,所以一次读多少是不确定的),一般大家又是通过什么方法判断的呢?
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel channel = server.accept();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) { // 读信息
SocketChannel channel = (SocketChannel) key.channel();
int count = channel.read(clientBuffer);
if (count > 0) {
clientBuffer.flip();
CharBuffer charBuffer = decoder.decode(clientBuffer);
System.out.println("Client >>" + charBuffer.toString());
SelectionKey wKey = channel.register(selector,
SelectionKey.OP_WRITE);
SelectionKey skTest = wKey.interestOps(SelectionKey.OP_WRITE);
}
问一下 :
SelectionKey wKey = channel.register(selector,SelectionKey.OP_WRITE);
SelectionKey skTest = wKey.interestOps(4);
这两句话的作用有什么区别?
Server端是通过什么知道一个channel的数据已经全部写到clientBuffer里面了(因为read 方法不堵塞,所以一次读多少是不确定的),一般大家又是通过什么方法判断的呢?
是注册的时候为其添加写事件
而SelectionKey skTest = wKey.interestOps(4);是注册后为其添加感兴趣的写事件(4对应的就是SelectionKey.OP_WRITE)
呵呵 做server的 刚开始学NIO 有些问题不太明白。
可以参考下比如mina里的相关实现
然后调用selecter.selectedKeys(),通过迭代key可以找到可用的channel。
if (key.isReadable()) { // 读信息
这行表名这个channel可以读数据。
SelectionKey skTest = wKey.interestOps(SelectionKey.OP_WRITE);
看变量名,就知道,仅仅是用于测试而已
SelectionKey skTest = wKey.interestOps(SelectionKey.OP_WRITE);
简单点 这两句话在这里的作用是不是一样的,是不是单独写任何一句都是同样的作用?
有了这句话,读操作就不起作用了