`

Yet another nio framework for java

    博客分类:
  • java
阅读更多

项目名称: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。

分享到:
评论
1 楼 rain2005 2009-08-25  
这么好的东东啊,正在学习中,以后碰到问题还请帮忙解答下啊。

相关推荐

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    java nio 实现socket

    java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket

    NioServer.java

    NioServer.java

    java NIO.zip

    java NIO.zip

    java NIO 中文版

    讲解了 JavaIO 与 JAVA NIO区别,JAVA NIO设计理念,以及JDK中java NIO中语法的使用

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    Java NIO英文高清原版

    Java NIO英文高清原版

    JavaNIO chm帮助文档

    Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...

    JavaNIO.zip_java nio_nio java

    java nio使用示例,介绍了java nio的常用类及使用方法

    java基于NIO实现Reactor模型源码.zip

    java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现...

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    JavaNIO服务器实例Java开发Java经验技巧共6页

    JavaNIO服务器实例Java开发Java经验技巧共6页.pdf.zip

    nio.rar_NIO_java nio_java_nio_mina java n

    nio教程,好的入门教材 ,

    java nio.pdf

    java nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava ...

    Using NIO to copy Java file fast.zip_java nio

    Using NIO to copy Java file fast

    java NIO技巧及原理

    java NIO技巧及原理解析,java IO原理,NIO框架分析,性能比较

    java nio中文版

    java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...

    JAVA NIO 学习资料

    JAVA NIO学习资料JAVA NIO学习资料

    java NIO实例

    实例介绍了一个简单的nio实例,适合刚接触nio的童鞋们....

    java nio proraming pdf

    java.nio (NIO stands for non-blocking I/O) is a collection of Java programming language APIs that offer features for intensive I/O operations. It was introduced with the J2SE 1.4 release of Java by ...

Global site tag (gtag.js) - Google Analytics