<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-23  評論-58  文章-0  trackbacks-0
    Reactor 模式的 JAVA NIO 多線程服務器,這是比較完善的一版了。Java 的 NIO 網(wǎng)絡模型實在是不好用,還是使用現(xiàn)成的好。
    public class NIOServer implements Runnable 
    {
        
    private static final Log log = LogFactory.getLog(NIOServer.class);

        
    private ExecutorService executor=null;
        
    private final Selector sel;
        
    private final ServerSocketChannel ssc;
        
    private HandleUtil ho;
        
        
    public NIOServer(int portnumber,HandleUtil ho) throws IOException
        
    {
            
    this.ho=ho;
            sel 
    = Selector.open();
            ssc 
    = ServerSocketChannel.open();
            ssc.socket().bind(
    new InetSocketAddress(portnumber));
            ssc.configureBlocking(
    false);
            ssc.register(sel,SelectionKey.OP_ACCEPT,
    new Acceptor());
        }

        
        
    public NIOServer(int portnumber,HandleUtil ho,ExecutorService executor) throws IOException
        
    {
            
    this.ho=ho;
            
    this.executor=executor;
            sel 
    = Selector.open();
            ssc 
    = ServerSocketChannel.open();
            ssc.socket().bind(
    new InetSocketAddress(portnumber));
            ssc.configureBlocking(
    false);
            ssc.register(sel,SelectionKey.OP_ACCEPT,
    new Acceptor());
        }

        
        @Override
        
    public void run()
        
    {
            
    try
            
    {
                
    while(sel.isOpen())
                
    {
                    
    int nKeys=sel.select(100);
                    
    if(nKeys==0)
                        Thread.sleep(
    100);
                    
    else if(nKeys>0)
                    
    {
                        Iterator
    <SelectionKey> it = sel.selectedKeys().iterator();
                        
    while (it.hasNext()) 
                        
    {
                            SelectionKey sk 
    = it.next();
                            it.remove();
                            
    if(sk.isAcceptable()||sk.isReadable()||sk.isWritable())
                            
    {
                                Runnable r 
    = (Runnable)sk.attachment();
                                r.run();
                            }

                        }

                    }

                }

            }

            
    catch(IOException | InterruptedException e)        { log.info(ExceptionUtil.getExceptionMessage(e));    }
        }

        
        
    class Acceptor implements Runnable 
        
    {
            @Override
            
    public void run() 
            
    {
                
    try
                
    {
                    SocketChannel sc 
    = ssc.accept();
                    
    if (sc != null)
                    
    {
                        sc.configureBlocking(
    false);
                        sc.socket().setTcpNoDelay(
    true);
                        sc.socket().setSoLinger(
    false-1);
                        SelectionKey sk
    =sc.register(sel, SelectionKey.OP_READ);
                        sk.attach(
    new Reader(sk));
                        sel.wakeup();
                    }

                }

                
    catch(IOException e) { log.info(ExceptionUtil.getExceptionMessage(e)); }
            }

        }

        
        
    class Reader implements Runnable 
        
    {
            
    private byte[] bytes=new byte[0];
            
    private SelectionKey sk;
            
            
    public Reader(SelectionKey sk)
            
    {
                
    this.sk=sk;
            }

            
            @Override
            
    public void run()
            
    {
                
    try
                
    {
                    SocketChannel sc 
    = (SocketChannel) sk.channel();
                    Handle handle
    =null;
                    
    if(ho.getParameterTypes()==null)
                        handle
    =(Handle)HandleUtil.getObjectByClassName(ho.getClassname());
                    
    else
                        handle
    =(Handle)HandleUtil.getObjectByClassName(ho.getClassname(), ho.getParameterTypes(), ho.getParameters());
                    handle.setSocketChannel(sc);
                    ByteBuffer buffer
    =ByteBuffer.allocate(1024);
                    
    int len=-1;
                    
    while(sc.isConnected() && (len=sc.read(buffer))>0)
                    
    {
                        buffer.flip();
                          
    byte [] content = new byte[buffer.limit()];
                        buffer.get(content);
                        bytes
    =StringUtil.arrayCoalition(bytes,content);
                        buffer.clear();
                    }

                    
    if(len==0)
                    
    {
                        
    if(executor==null)
                        
    {
                            
    byte[] bb=handle.execute(bytes);
                            sk.interestOps(SelectionKey.OP_WRITE);
                            sk.attach(
    new Writer(sk,ByteBuffer.wrap(bb)));
                            sk.selector().wakeup();
                        }

                        
    else
                        
    {
                            handle.setData(bytes);
                            Future
    <byte[]> future=executor.submit(handle);
                            sk.interestOps(SelectionKey.OP_WRITE);
                            sk.attach(
    new Writer(sk,future));
                            sk.selector().wakeup();
                        }

                    }

                    
    else if(len==-1)
                    
    {
                        sk.cancel();
                        sk.selector().selectNow();
                        sc.close();
                    }

                }

                
    catch(Exception e)
                
    {
                    sk.cancel();
                    log.info(ExceptionUtil.getExceptionMessage(e));
                }

            }

        }

        
        
    public class Writer implements Runnable 
        
    {
            
    private SelectionKey sk;
            
    private ByteBuffer output;
            
            
    public Writer(SelectionKey sk,ByteBuffer output)
            
    {
                
    this.sk=sk;
                
    this.output=output;
            }

            
            
    public Writer(SelectionKey sk,Future<byte[]> future) throws InterruptedException, ExecutionException
            
    {
                
    this.sk=sk;
                
    this.output=ByteBuffer.wrap(future.get());
            }

            
            @Override
            
    public void run()
            
    {
                SocketChannel sc 
    = (SocketChannel) sk.channel();
                
    try
                
    {
                    
    while(sc.isConnected() && output.hasRemaining())
                    
    {
                        
    int len=sc.write(output);
                        
    if(len<0)
                            
    throw new EOFException();
                        
    else if(len==-1)
                        
    {
                            sk.cancel();
                            sk.selector().selectNow();
                            sc.close();
                        }

                    }

                    
    if(!output.hasRemaining())
                    
    {
                        output.clear();
                        sk.interestOps(SelectionKey.OP_READ);
                        sk.attach(
    new Reader(sk));
                        sk.selector().wakeup();
                    }

                }

                
    catch(Exception e)
                
    {
                    sk.cancel();
                    log.info(ExceptionUtil.getExceptionMessage(e));
                }

            }

        }

        
        
    public void send(SocketChannel sc,byte[] bytes) throws ClosedChannelException
        
    {
            SelectionKey sk
    =sc.register(sel, SelectionKey.OP_WRITE);
            sk.attach(
    new Writer(sk,ByteBuffer.wrap(bytes)));
            sel.wakeup();
        }

    }


    posted on 2013-05-14 16:31 nianzai 閱讀(2727) 評論(1)  編輯  收藏 所屬分類: NIO

    評論:
    # re: JAVA NIO 多線程服務器 1.3版 [未登錄] 2013-09-18 15:34 | z
    Handle 這個方法里面寫的是什么處理呢?能否也貼出來看看  回復  更多評論
      

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲av日韩av永久无码电影| 久久精品国产亚洲AV大全| 亚洲成av人片天堂网无码】| 美女视频黄免费亚洲| 91嫩草私人成人亚洲影院| 最近2019中文字幕免费大全5 | 亚洲精品无码少妇30P| 69影院毛片免费观看视频在线| 久久久久亚洲AV无码专区首| 成人A片产无码免费视频在线观看| 亚洲码国产精品高潮在线| 97国免费在线视频| 亚洲国产精品免费视频| 亚洲综合免费视频| 亚洲欧美aⅴ在线资源| 全黄a免费一级毛片人人爱| 国产97视频人人做人人爱免费| 国产亚洲精品va在线| 久9这里精品免费视频| 亚洲精品综合久久中文字幕| 成年女人喷潮毛片免费播放| 美女尿口扒开图片免费| 亚洲人JIZZ日本人| 99久久免费中文字幕精品| 456亚洲人成在线播放网站| 国产精品深夜福利免费观看| 国产精品青草视频免费播放| 亚洲av无码精品网站| 性短视频在线观看免费不卡流畅| 亚洲精品动漫免费二区| 国产成人综合亚洲亚洲国产第一页| 色欲A∨无码蜜臀AV免费播| 亚洲成年人电影网站| 免费大香伊蕉在人线国产| 韩国免费a级作爱片无码| 亚洲精品国产福利片| 国产一级特黄高清免费大片| 大地资源中文在线观看免费版| 国产99在线|亚洲| 中文字幕亚洲不卡在线亚瑟| 免费不卡视频一卡二卡|