項(xiàng)目名稱:Yanf4j(Yet another nio framework for java)
項(xiàng)目地址:
http://code.google.com/p/yanf4j/,當(dāng)前版本0.30-beta1
協(xié)議:Apache License, Version 2.0
簡(jiǎn)單描述:
有這么多nio框架了,為什么要another?重復(fù)造輪子也罷,這框架脫胎于一個(gè)服務(wù)器項(xiàng)目的網(wǎng)絡(luò)層代碼,期間參考了cindy、grizzly等nio框架的實(shí)現(xiàn),加上自己的一些心得體會(huì)實(shí)現(xiàn)的。特點(diǎn)是簡(jiǎn)單、小巧、超輕量級(jí)。項(xiàng)目沒(méi)有多大野心,目標(biāo)是高效、簡(jiǎn)單地實(shí)現(xiàn)非阻塞模式的Server(TCP、UDP)并且保證不錯(cuò)的性能要求,不提供客戶端API 和阻塞模式。如果你的項(xiàng)目需要實(shí)現(xiàn)一個(gè)socket server并且不希望用太重量級(jí)的框架,yanf4j是個(gè)不錯(cuò)的選擇。
例子,在source archive中帶有例子,這里描述下tcp和udp的echo server的實(shí)現(xiàn)。
一、先看TCP的Echo Server
1、實(shí)現(xiàn)處理handler,繼承HandlerAdapter類,實(shí)現(xiàn)相應(yīng)的回調(diào)方法,這與其他nio框架沒(méi)啥區(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、實(shí)現(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)會(huì)在classpath查找yanf4j.properties屬性文件,用于配置服務(wù)器屬性,然而,你也看到,可以編碼設(shè)置這些屬性,具體參考wiki。
3、然后?沒(méi)然后了,一個(gè)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é),請(qǐng)參考項(xiàng)目主頁(yè)上的
wiki。