Yet another nio framework for java
生活随笔
收集整理的這篇文章主要介紹了
Yet another nio framework for java
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
項(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)目沒有多大野心,目標(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框架沒啥區(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、然后?沒然后了,一個(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();
項(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)目沒有多大野心,目標(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框架沒啥區(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、然后?沒然后了,一個(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。
文章轉(zhuǎn)自莊周夢(mèng)蝶? ,原文發(fā)布時(shí)間2008-10-11
總結(jié)
以上是生活随笔為你收集整理的Yet another nio framework for java的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openstack horizon国际化
- 下一篇: 一个脚本实现全量增量备份,并推送到远端备