Java IO学习笔记七:多路复用从单线程到多线程
发布时间:2023-04-17 11:40:04 所属栏目:教程 来源:
导读: public void readHandler(SelectionKey key) {
SocketChannel client = (SocketChannel) key.channel();
ByteBuffer buffer = (ByteBuffer) key.attachment();
buffer.clear();
SocketChannel client = (SocketChannel) key.channel();
ByteBuffer buffer = (ByteBuffer) key.attachment();
buffer.clear();
|
public void readHandler(SelectionKey key) { SocketChannel client = (SocketChannel) key.channel(); ByteBuffer buffer = (ByteBuffer) key.attachment(); buffer.clear(); int read; try { while (true) { read = client.read(buffer); if (read > 0) { buffer.flip(); while (buffer.hasRemaining()) { client.write(buffer); } buffer.clear(); } else if (read == 0) { break; } else { client.close(); break; } } } catch (IOException e) { e.printstacktrace(); } } 为了权责清晰一些,我们分开了两个事件处理: Set<SelectionKey> selectionKeys = selector.selectedKeys(); Iterator<SelectionKey> iter = selectionKeys.iterator(); while (iter.hasNext()) { SelectionKey key = iter.next(); iter.remove(); if (key.isAcceptable()) { acceptHandler(key); } else if (key.isReadable()) { // 处理读数据 readHandler(key); } else if (key.isWritable()) { // 处理写数据 writeHandler(key); } } 一个负责写,一个负责读 读的事件处理, 如下代码 public void readHandler(SelectionKey key) { System.out.println("read handler....."); SocketChannel client = (SocketChannel) key.channel(); ByteBuffer buffer = (ByteBuffer) key.attachment(); buffer.clear(); int read = 0; try { while (true) { read = client.read(buffer); if (read > 0) { client.register(key.selector(), SelectionKey.OP_WRITE, buffer); } else if (read == 0) { break; } else { client.close(); break; } } } catch (IOException e) { e.printstacktrace(); } } 其中read > 0 即从客户端读取到了数据,我们才注册一个写事件: client.register(key.selector(), SelectionKey.OP_WRITE, buffer); 其他事件不注册写事件。(PS:只要send-queue没有满,就可以注册写事件) 写事件的处理逻辑如下: private void writeHandler(SelectionKey key) { System.out.println("write handler..."); SocketChannel client = (SocketChannel) key.channel(); ByteBuffer buffer = (ByteBuffer) key.attachment(); buffer.flip(); while (buffer.hasRemaining()) { try { client.write(buffer); } catch (IOException e) { e.printstacktrace(); } } buffer.clear(); key.cancel(); try { client.close(); } catch (IOException e) { e.printstacktrace(); } } (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
