欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

手写 reactor( netty reactor 模型)

程序员文章站 2022-05-22 08:30:10
...

 

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/


手写 reactor( netty reactor 模型)
            
    
    博客分类: javanetty 手写reactornettyjava模型手写 reactor( netty reactor 模型)
            
    
    博客分类: javanetty 手写reactornettyjava模型手写 reactor( netty reactor 模型)
            
    
    博客分类: javanetty 手写reactornettyjava模型
 
 
 谢谢您的赞助,我会做的更好!