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

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

Yet another nio framework for java相关推荐

  1. 也谈BIO | NIO | AIO (Java版--转)

    http://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BI ...

  2. java nio copy_使用NIO快速复制Java文件

    package com.test.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutpu ...

  3. (一:NIO系列)JAVA NIO 简介

    出处:JAVA NIO 简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O, ...

  4. java nio node_支撑 Java NIO 与 NodeJS 的底层技术

    众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我们今天要讨论的话题就是支撑这些技术的底层技术. 开 ...

  5. java nio is例子,Java Buffer isDirect()用法及代码示例

    java.nio.Buffer类的isDirect()方法用于判断此缓冲区是否是直接缓冲区. 用法: public abstract boolean isDirect() 返回值:当且仅当此缓冲区是直 ...

  6. java nio详解,Java NIO API详解

    Java NIO API详解 在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的阻塞(blocking)API.对于大多数应用来说,这样的API使用很方 便,然而,一些对 ...

  7. Java Plugin Framework (JPF) java插件框架学习

    2019独角兽企业重金招聘Python工程师标准>>> JPF (Java Plugin Framework) 是一个插件框架,类似Eclipse的插件系统,不过这个的依赖关系是使用 ...

  8. java nio改造io,java – 将NIO与IO混合

    通常,您有一个绑定的tcp端口和几个连接.至少通常有更多连接作为绑定端口.我的情况不同:我想绑定很多端口,通常没有(或至少很少)连接. 所以我想使用NIO来接受传入的连接. 但是,我需要将接受的连接传 ...

  9. .net framework与java,分布式事务:.NET Framework与.NET Core

    我有以下代码示例: static void Main(string[] args) { TransactionManager.DistributedTransactionStarted += (sen ...

最新文章

  1. PyQt Qwidget笔记
  2. 如何去遍历对象中的所有的属性值
  3. 企业传播可以考虑放弃公众号了
  4. android录制视频横向,Android从零开始(26)(设置全屏+横屏、相机拍照、视频录制)(新)...
  5. [Swift通天遁地]七、数据与安全-(12)使用Instruments Leaks工具检测内存泄露
  6. 解决Fast api打印两次日志的问题
  7. laravel中的ORM模型修改created_at,updated_at,deleted_at三个时间字段类型
  8. Spring-IOC本质
  9. python 顺序遍历文件夹下的文件
  10. ie加载项存在残留是什么_残余IE加载项无法修复
  11. c语言编程悬臂梁受力分析,悬臂梁受力分析.doc
  12. 解决Linux上rar压缩包文件无法解压缩的问题
  13. 江西财经大学第一届程序设计竞赛题解
  14. 阅读书籍:Monte Carlo Methods(第一章 Introduction to Monte CarloMethods)
  15. Basler驱动如何彩色相机白平衡说明
  16. 疫情下的长租公寓:蛋壳们的“生死考”
  17. 突发,国内技术问答社区SegmentFault竟然被ONES收购
  18. 【评测】iPS细胞相关实验服务机构-魔法师的仓库
  19. 第12章、类和动态内存分配
  20. html获取中国天气,Json获取中国天气网天气预报的代码

热门文章

  1. 手写一个合格的前端脚手架
  2. Golang——垃圾回收GC(2)
  3. Teradata天睿公司推出适用各种部署环境的全球最强分析数据库
  4. 《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.5 为跨年度的个人参赛选手构造记录...
  5. 10.python网络编程(socket server 实现并发 part 2)
  6. WebForm 使用点滴。。。。
  7. django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
  8. C#读写txt文件的两种方法介绍
  9. 小女生的Linux技术~~~Linux常识~~21-30
  10. python删除数据库的数据完整代码_利用python操作小程序云数据库实现简单的增删改查...