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

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

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

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    Yet another nio framework for java

    Posted on 2008-10-11 14:25 dennis 閱讀(2842) 評論(6)  編輯  收藏 所屬分類: javamy open-source
    項目名稱:Yanf4j(Yet another nio framework for java)
    項目地址:http://code.google.com/p/yanf4j/,當(dāng)前版本0.30-beta1
    協(xié)議:Apache License, Version 2.0
    簡單描述:
        有這么多nio框架了,為什么要another?重復(fù)造輪子也罷,這框架脫胎于一個服務(wù)器項目的網(wǎng)絡(luò)層代碼,期間參考了cindy、grizzly等nio框架的實現(xiàn),加上自己的一些心得體會實現(xiàn)的。特點是簡單、小巧、超輕量級。項目沒有多大野心,目標(biāo)是高效、簡單地實現(xiàn)非阻塞模式的Server(TCP、UDP)并且保證不錯的性能要求,不提供客戶端API 和阻塞模式。如果你的項目需要實現(xiàn)一個socket server并且不希望用太重量級的框架,yanf4j是個不錯的選擇。

        例子,在source archive中帶有例子,這里描述下tcp和udp的echo server的實現(xiàn)。
     一、先看TCP的Echo Server
    1、實現(xiàn)處理handler,繼承HandlerAdapter類,實現(xiàn)相應(yīng)的回調(diào)方法,這與其他nio框架沒啥區(qū)別:
    import com.google.code.yanf4j.nio.Dispatcher;
    import com.google.code.yanf4j.nio.Session;
    import com.google.code.yanf4j.nio.impl.HandlerAdapter;
    import com.google.code.yanf4j.nio.util.DispatcherFactory;

    public class EchoHandler extends HandlerAdapter<String> {

        Dispatcher dispatcher 
    = DispatcherFactory.newDispatcher(4);

        @Override
        
    public void onException(Session session, Throwable t) {
            t.printStackTrace();
        }

        @Override
        
    public void onMessageSent(Session session, String t) {
            System.out.println("sent " + t + " to "
                        
    + session.getRemoteSocketAddress());
        }

        @Override
        
    public void onSessionStarted(Session session) {
            System.out.println("session started");
            session.setUseBlockingRead(
    true);
            session.setUseBlockingWrite(
    false);
        }

        
    public void onSessionCreated(Session session) {
            System.out.println(session.getRemoteSocketAddress().toString()
                        
    + " connected");
        }

        
    public void onSessionClosed(Session session) {
            System.out.println(session.getRemoteSocketAddress().toString()
                        
    + " disconnected");

        }

        
    public void onReceive(final Session session, final String msg) {
            System.out.println("recv:" + msg);
            
    if (msg != null)
                dispatcher.dispatch(
    new Runnable() {
                    
    public void run() {

                        
    if (msg.equals("q"))
                            session.close();
                        session.send(msg);
                    }
                });
        }

    }


    2、實現(xiàn)EchoServer,核心是TCPController類的使用:

            Configuration configuration = new Configuration();
            configuration.setStatisticsServer(
    true);
            configuration.setTcpSessionReadBufferSize(
    256 * 1024); // 設(shè)置讀的緩沖區(qū)大小
            AbstractController controller = new TCPController(configuration,
                    
    new StringCodecFactory());
            controller.setPort(
    8080); // 設(shè)置端口
            controller.setReadThreadCount(1); // 設(shè)置讀線程數(shù),通常為1
            controller.setReceiveBufferSize(16 * 1024); // 設(shè)置socket接收緩沖區(qū)大小
            controller.setReuseAddress(false); // 設(shè)置是否重用端口
            controller.setHandler(new EchoHandler()); // 設(shè)置handler
            controller.setHandleReadWriteConcurrently(true); // 設(shè)置是否允許讀寫并發(fā)處理
            controller.addStateListener(new ServerStateListener());
            controller.start();

    Configuration 默認(rèn)會在classpath查找yanf4j.properties屬性文件,用于配置服務(wù)器屬性,然而,你也看到,可以編碼設(shè)置這些屬性,具體參考wiki。

    3、然后?沒然后了,一個TCP的echo server已經(jīng)搞定了,你可以telnet到8080端口試試了。

    二、UDP的Echo server
    1、handler,可以復(fù)用前面的EchoHandler
    2、UDP的核心類是UDPController:

            Configuration configuration = new Configuration();
            configuration.setTcpPort(
    8090);
            configuration.setTcpReuseAddress(
    false);
            configuration.setStatisticsServer(
    true);
            configuration.setTcpNoDelay(
    true);
            configuration.setTcpReadThreadCount(
    1);
            configuration.setTcpRecvBufferSize(
    16 * 1024);
            UDPController controller 
    = new UDPController(configuration);
            controller.setMaxDatagramPacketLength(
    1024);
            controller.setHandler(
    new EchoHandler());
            controller.start();

      更多細(xì)節(jié),請參考項目主頁上的wiki



    評論

    # re: Yet another nio framework for java  回復(fù)  更多評論   

    2008-10-15 09:48 by wavefly
    編程風(fēng)格和Mina有些類似:pre-event,看看你的源碼先……

    # re: Yet another nio framework for java  回復(fù)  更多評論   

    2008-10-15 10:17 by dennis
    @wavefly
    嗯,多多指教。整體架構(gòu)上并無多少新意,仍然是reactor+事件觸發(fā)機制,只是在cindy的基礎(chǔ)上揉和了grizzly的一些長處。私下里說,其實就是俺想鍛煉學(xué)習(xí)nio罷了。

    # re: Yet another nio framework for java  回復(fù)  更多評論   

    2009-02-18 18:11 by 菜鳥問道
    能否舉例說明客戶端API調(diào)用?讓我學(xué)一下??

    # re: Yet another nio framework for java  回復(fù)  更多評論   

    2009-02-18 23:22 by dennis
    @菜鳥問道
    本來沒有客戶端API的,yanf4j一開始定位在服務(wù)器框架上。不過我最近添加了客戶端API支持,請從svn獲取

    # re: Yet another nio framework for java  回復(fù)  更多評論   

    2009-02-20 00:59 by 菜鳥問道
    請從svn獲取?
    多謝大俠回答,問下SVN是什么意思?

    # re: Yet another nio framework for java  回復(fù)  更多評論   

    2010-03-22 12:23 by yonlist
    厲害,膜拜一下,學(xué)習(xí)一下
    主站蜘蛛池模板: 毛片在线全部免费观看| 精品视频免费在线| 中文字幕亚洲一区| 亚洲国产精华液2020| 中国人免费观看高清在线观看二区| 亚洲精品tv久久久久| 亚洲乱码无码永久不卡在线| 日本激情猛烈在线看免费观看| 亚洲人成精品久久久久| 亚洲成av人片天堂网无码】| 黄页网站免费观看| 亚洲三级中文字幕| 成人午夜免费福利| 国产精品亚洲а∨无码播放不卡 | 免费观看91视频| 精品国产亚洲一区二区三区| 在线观看免费无码视频| 亚洲人成影院在线无码按摩店| 麻豆亚洲av熟女国产一区二| 30岁的女人韩剧免费观看| 夜色阁亚洲一区二区三区| 亚洲AV无码AV日韩AV网站| 国产免费看插插插视频| 成人一级免费视频| 相泽亚洲一区中文字幕| 永久免费av无码入口国语片| 1区1区3区4区产品亚洲| 好吊妞788免费视频播放| 尤物视频在线免费观看| 免费在线观看黄网| 亚洲美女视频免费| 成人午夜视频免费| 一级毛片在线免费播放| 国产亚洲精品无码成人| 久久久久久精品免费看SSS | 在线观看亚洲网站| 亚洲区不卡顿区在线观看| 免费观看在线禁片| 亚洲AV无码一区二区三区性色 | 亚洲综合精品香蕉久久网97| 91高清免费国产自产|