手写 reactor( netty reactor 模型)
程序员文章站
2022-04-14 07:57:23
...
public class Dispacther implements Runnable{ private String host = "127.0.0.1"; private int port = 8080; public final Selector selector; public final ServerSocketChannel serverSocketChannel; public Dispacther() throws IOException { selector=Selector.open(); serverSocketChannel=ServerSocketChannel.open(); InetSocketAddress inetSocketAddress=new InetSocketAddress(this.host,this.port); serverSocketChannel.socket().bind(inetSocketAddress); serverSocketChannel.configureBlocking(false); SelectionKey selectionKey=serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); selectionKey.attach(new Acceptor(this)); } @Override public void run() { try { while(!Thread.interrupted()){ selector.select(); Set<SelectionKey> selectionKeys= selector.selectedKeys(); Iterator<SelectionKey> it=selectionKeys.iterator(); while(it.hasNext()){ SelectionKey selectionKey=it.next(); dispatch(selectionKey); selectionKeys.clear(); } } } catch (IOException e) { e.printStackTrace(); } } void dispatch(SelectionKey key) { Runnable r = (Runnable)(key.attachment()); if (r != null){ r.run(); } } }
public class Acceptor implements Runnable{ private Dispacther dispacther; public Acceptor(Dispacther dispacther) { this.dispacther = dispacther; } @Override public void run() { try { SocketChannel socketChannel=dispacther.serverSocketChannel.accept(); if(socketChannel!=null) new SocketHandler(dispacther.selector, socketChannel); } catch (IOException e) { e.printStackTrace(); } } }
public class SocketHandler implements Runnable { private SocketChannel socketChannel; private Charset charset = Charset.forName("UTF-8"); private Selector selector; public SocketHandler(Selector selector,SocketChannel socketChannel) throws IOException{ this.socketChannel=socketChannel; this.selector = selector; socketChannel.configureBlocking(false); SelectionKey selectionKey=socketChannel.register(selector, 0); selectionKey.attach(this); selectionKey.interestOps(SelectionKey.OP_READ); selector.wakeup(); } @Override public void run() { try { ByteBuffer buff = ByteBuffer.allocate(1024); String content = ""; while (socketChannel.read(buff) > 0) { socketChannel.read(buff); buff.flip(); content += charset.decode(buff); } if(!"".equals(content)){ System.out.println( " content : " + content); for (SelectionKey key : this.selector.keys()) { Channel targetChannel = key.channel(); if (targetChannel instanceof SocketChannel) { SocketChannel dest = (SocketChannel) targetChannel; dest.write(charset.encode(content)); dest.close(); } } } } catch (IOException e) { e.printStackTrace(); } } }
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信 以及扣扣群),没钱捧个人场,谢谢各位。
个人主页:http://knight-black-bob.iteye.com/
谢谢您的赞助,我会做的更好!
上一篇: java可视化tiff转pdf工具
下一篇: Google推出智能手机同步服务
推荐阅读
-
Netty做什么?第一个Netty服务如何写?Netty的IO和Reactor模型?Netty组件是什么?ByteBuf是什么?(Netty一)
-
解析Linux高性能网络IO和Reactor模型
-
【面试题】研究过tomcat的NioEndpoint源码吗?请阐述下Reactor多线程模型在tomcat中的实现。
-
Netty源码分析(二):Reactor模型在Netty中的应用
-
手写 reactor( netty reactor 模型)
-
Netty做什么?第一个Netty服务如何写?Netty的IO和Reactor模型?Netty组件是什么?ByteBuf是什么?(Netty一)
-
手写 reactor( netty reactor 模型)
-
解析Linux高性能网络IO和Reactor模型
-
Netty源码分析(二):Reactor模型在Netty中的应用
-
【面试题】研究过tomcat的NioEndpoint源码吗?请阐述下Reactor多线程模型在tomcat中的实现。