<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í)一下
    主站蜘蛛池模板: 又黄又爽又成人免费视频| 好看的电影网站亚洲一区| 99久久精品免费精品国产| 色一情一乱一伦一视频免费看| 亚洲精品视频专区| 亚洲精品乱码久久久久久按摩| 日本一线a视频免费观看| 又黄又爽又成人免费视频| 久久免费看少妇高潮V片特黄| 男男黄GAY片免费网站WWW| 国产成人精品日本亚洲网址| 久久久亚洲欧洲日产国码农村| 2048亚洲精品国产| 四虎永久免费影院| 女人18毛片水真多免费播放| 毛片无码免费无码播放| 四虎国产精品免费永久在线| 一个人看的www免费高清| 免费看一级一级人妻片 | 91短视频在线免费观看| 男女一边桶一边摸一边脱视频免费 | 亚洲另类无码一区二区三区| 亚洲国色天香视频| 亚洲视频免费在线播放| 亚洲国产精品一区| 亚洲网址在线观看你懂的| 久久亚洲高清观看| 亚洲精品国产美女久久久| 亚洲色婷婷六月亚洲婷婷6月| 激情97综合亚洲色婷婷五| 亚洲最大av无码网址| 亚洲夜夜欢A∨一区二区三区| 亚洲国产成人久久综合一区77| 免费午夜爽爽爽WWW视频十八禁 | 亚洲熟妇av午夜无码不卡| 精品久久久久久亚洲精品| 亚洲欧洲日本在线观看 | 野花高清在线观看免费完整版中文| 免费看男女下面日出水来| 一二三四视频在线观看中文版免费| 一个人免费高清在线观看|