博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Yet another nio framework for java
阅读量:5951 次
发布时间:2019-06-19

本文共 3144 字,大约阅读时间需要 10 分钟。

项目名称:Yanf4j(Yet another nio framework for java)
项目地址: ,当前版本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();

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

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

转载地址:http://fvpxx.baihongyu.com/

你可能感兴趣的文章
Git 忽略
查看>>
iOS开发小技巧--iOS程序进入后台运行的实现
查看>>
七个错误可能引发网页布局灾难
查看>>
判断系统是否是中文的
查看>>
窗口改变的时候自动刷新浏览器
查看>>
Java 类型转换(int->String)
查看>>
OAF_开发系列18_实现OAF页面跳转setForwardURL / forwardImmediately(案例)
查看>>
ASP.NET Core Docker部署
查看>>
家宝贝项目历程之三(全部模块完成)
查看>>
img的onerror事件
查看>>
java代码-------Runnable的用法
查看>>
ZOJ4108 Fibonacci in the Pocket
查看>>
Python 数据图表工具的比较
查看>>
移动端版本兼容js
查看>>
mongos-sharding连接池配置
查看>>
jdbc方式mysql语句增删改查
查看>>
ruby symbol详解
查看>>
字符串查找 cmd find命令
查看>>
常用函数式接口与Stream API简单讲解
查看>>
114ic电子元器件网
查看>>