Yet another nio framework for java

    xiaoxiao2024-05-08  109

    项目名称:Yanf4j(Yet another nio framework for java) 项目地址: http://code.google.com/p/yanf4j/,当前版本0.30-beta1 协议:Apache License, Version 2.0 简单描述:     有这么多nio框架了,为什么要another?重复造轮子也罢,这框架脱胎于一个服务器项目的网络层代码,期间参考了cindy、grizzly等nio框架的实现,加上自己的一些心得体会实现的。特点是简单、小巧、超轻量级。项目没有多大野心,目标是高效、简单地实现非阻塞模式的Server(TCP、UDP)并且保证不错的性能要求,不提供客户端API 和阻塞模式。如果你的项目需要实现一个socket server并且不希望用太重量级的框架,yanf4j是个不错的选择。     例子,在source archive中带有例子,这里描述下tcp和udp的echo server的实现。  一、先看TCP的Echo Server 1、实现处理handler,继承HandlerAdapter类,实现相应的回调方法,这与其他nio框架没啥区别: 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、实现EchoServer,核心是TCPController类的使用:         Configuration configuration  =   new  Configuration();         configuration.setStatisticsServer( true );         configuration.setTcpSessionReadBufferSize( 256   *   1024 );  //  设置读的缓冲区大小         AbstractController controller  =   new  TCPController(configuration,                  new  StringCodecFactory());         controller.setPort( 8080 );  //  设置端口         controller.setReadThreadCount( 1 );  //  设置读线程数,通常为1         controller.setReceiveBufferSize( 16   *   1024 );  //  设置socket接收缓冲区大小         controller.setReuseAddress( false );  //  设置是否重用端口         controller.setHandler( new  EchoHandler());  //  设置handler         controller.setHandleReadWriteConcurrently( true );  //  设置是否允许读写并发处理         controller.addStateListener( new  ServerStateListener());         controller.start(); Configuration 默认会在classpath查找yanf4j.properties属性文件,用于配置服务器属性,然而,你也看到,可以编码设置这些属性,具体参考wiki。 3、然后?没然后了,一个TCP的echo server已经搞定了,你可以telnet到8080端口试试了。 二、UDP的Echo server 1、handler,可以复用前面的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();

      更多细节,请参考项目主页上的wiki。

    文章转自庄周梦蝶  ,原文发布时间2008-10-11

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)