Yet another nio framework for 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.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.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.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。