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.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

selenium 使用js执行脚本儿链接整理

2019独角兽企业重金招聘Python工程师标准>>> 使用Webdriver执行js小结&#xff1a;http://lijingshou.iteye.com/blog/2018929 SeleniumWebdriver学习(三)执行JS脚本&#xff1a;http://www.tuicool.com/articles/buIbeiN selenium webdriver 执行javascript代码&am…

C和指针之字符串之strncpy、strncat、strncmp

1、strncpy、strncat、strncmp 1)、函数原型char *strncpy(char *dest,char *src,size_t n); 复制字符串src中的内容(字符,数字、汉字....)到字符串dest中,复制多少由size_t n的值决定。如果src的前n个字符不含NULL字符,则结果不会以NULL字符结束。如果n<src的长度,只…

接口返回json对象出现套娃递归问题 | System.Text.Json 版本

前言看到一篇文章《Asp-Net-Core开发笔记&#xff1a;接口返回json对象出现套娃递归问题》原文是使用 NewtonsoftJson 解决的返回json对象出现套娃递归问题&#xff1a;services.AddControllersWithViews().AddNewtonsoftJson(options > {options.SerializerSettings.Refere…

高效性跨平台分布式软件开发技术——gRPC

文章目录1. gRPC&#xff08;google Remote Procedure Call&#xff09; 技术 —— 高效性地跨平台、跨语言开发2. 基于 python 实现 gRPC 框架2.1 一个 gPRC 项目必须包含的几大部分2.2 helloworld.proto 文件——定义全局可调用函数及其参数数据结构2.3 server.py 文件——实…

在VS中设置比较和谐的字体和颜色的方法

作者&#xff1a;朱金灿来源&#xff1a;http://blog.csdn.net/clever101先在studiostyl.es网站选择你喜欢的字体方案&#xff0c;我个人比较喜欢这款&#xff1a;Humane Studio&#xff0c;注意在网页上选择你使用VS版本&#xff0c;然后单击Downlaod this scheme就可以了&…

C和指针之字符串strchr、strpbrk、strstr

1、strchr、strpbrk、strstr 1) char *strchr(const char *s, int c); 在s中找字符c 第一次出现的地方,返回这个指向该位置的指针,没找到返回NULL 2) char *strrchr(const char *s, int c); 在s中最右边找字符c 第一次出现的地方,返回这个指向该位置的指针,没…

一个脚本实现全量增量备份,并推送到远端备份中心服务器

2019独角兽企业重金招聘Python工程师标准>>> 摘要 由于工作需要&#xff0c;刚好需要这样一个功能的脚本&#xff0c;主要解决&#xff1a; 1. 不想在crontab中调度两条备份任务&#xff0c;一个做全量一个做增量 2. 如果每小时做增量&#xff0c;凌晨4点做全量&…

.NET 7 预览版 2 已发布,NativeAOT 正式可用

.NET 7 Preview 2 已发布&#xff0c;第二个预览版包括对 RegEx 源生成器的增强、将 NativeAOT 从实验状态转移到运行时的进展&#xff0c;以及对“dotnet new”CLI SDK 的一系列重大改进。在此下载适用于 Windows、macOS 和 Linux 的 .NET 7 Preview 2 。引入新的正则表达式源…

地壳中元素含量排名记忆口诀_Nature:利用熔融包裹体的元素和同位素示踪俯冲带流体来源...

Nature&#xff1a;利用熔融包裹体的元素和同位素示踪俯冲带流体来源在汇聚板块边缘&#xff0c;大洋岩石圈通过俯冲作用携带挥发分(尤其是水)进入地幔。这些俯冲下去的水/流体控制着岩浆产物、地震活动、陆壳形成和资源成矿。但是&#xff0c;识别不同流体的来源(沉积物&#…

Windows 10开发基础——文件、文件夹和库(一)

Windows 10开发基础——文件、文件夹和库&#xff08;一&#xff09; 原文:Windows 10开发基础——文件、文件夹和库&#xff08;一&#xff09;主要内容&#xff1a; 1.枚举查询文件和文件夹 2.文本文件读写的三种方法——创建写入和读取文件 3.获得文件的属性 枚举查询文件和…

Sigmoid函数与逻辑回归

文章目录(1). Sigmoid函数的由来——伯努利分布的衍生物1.1 为什么会有 sigmoid 函数的出现&#xff1f;1.2 sigmoid 函数推导过程1.3 sigmoid 函数求导(2). 逻辑回归&#xff08;Logistic Regression&#xff09;2.1 逻辑回归算法的最终本质——求决策边界2.2 逻辑回归算法中的…

C和指针之字符串实现strrstr函数

1、问题 实现strrstr(const char *str, const char *str2)函数,就是从最右边开始,找到第一次出现字符str2,然后返回指向这个字符的指针,找不到返回NULL,str2和str1一个为NULL 返回 NULL 2、思路 我们用2个变量, 先用strstr一个变量找一个保存当前地址,然后再用strstr去…

括号匹配

CTRL SHIFTP 括号匹配

react connect

connect([mapStateToProps], [mapDispatchToProps], [mergeProps],[options])连接 React 组件与 Redux store。连接操作不会改变原来的组件类&#xff0c;反而返回一个新的已与 Redux store 连接的组件类。参数[mapStateToProps(state, [ownProps]): stateProps] (Function): 如…

Avalonia跨平台入门第二十二篇之人脸检测

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送、语音播放、语音播放问题、玩…

pkpm板按弹性计算还是塑性_PKPM中的S\R验算显红原因分析

PKPM软件砼结构施工图中的&#xff0c;梁的配筋面积中&#xff0c;SR验算&#xff0c;经常会有个别构件显红的情况。查了一下PKPM说明书&#xff0c;并没有针对此情况的详细说明。根据本人的实际经验&#xff0c;总结了一下解决此问题的主要方法&#xff1a;一.超筋SR的值显示为…

C和指针之字符串strspn、strcspn函数源代码的实现

1、strspn strcspn介绍 1)size_t strspn(const char *str, const char * accept); 我的理解是字符串str中前面连续的字符有多少在accept中,如果哪一个没在accept中,就到这里结束了,后面不比了,比如 char *str = "xnufux dfafa"; char accept = "linux"…

StackExchange.Redis 使用 (一)

在StackExchange.Redis中最重要的对象是ConnectionMultiplexer类&#xff0c; 它存在于StackExchange.Redis命名空间中。这个类隐藏了Redis服务的操作细节&#xff0c;ConnectionMultiplexer类做了很多东西&#xff0c; 在所有调用之间它被设计为共享和重用的。不应该为每一个操…

多智能体连续行为空间问题求解——MADDPG

目录1. 问题出现&#xff1a;连续行为空间出现2. DDPG 算法2.1 DDPG 算法原理2.2 DDPG 算法实现代码2.2.1 Actor & Critic2.2.2 Target Network2.2.3 Memory Pool2.2.4 Update Parameters&#xff08;evaluate network&#xff09;2.2.5 Update Parameters&#xff08;targ…

在.NET 6 中如何创建和使用 HTTP 客户端 SDK

如今&#xff0c;基于云、微服务或物联网的应用程序通常依赖于通过网络与其他系统通信。每个服务都在自己的进程中运行&#xff0c;并解决一组有限的问题。服务之间的通信是基于一种轻量级的机制&#xff0c;通常是一个 HTTP 资源 API。从.NET 开发人员的角度来看&#xff0c;我…