Grizzly学习笔记(一)

简介:

Grizzly是基于JAVA NIO的网络通信框架,网上一些网友的测试来看,grizzly的性能比较好。

所以决定学习一下这个framework.
Grizzly目前有两个版本,一个是1.9.x,一个2.x. 目前除了2.x还有一些Guide外,1.9及其早期版本都没有文档,网上资料相对MINA要少得多。
更不可思议的是,Grizzly的每个版本的API,变化都非常大(没见过这么玩的),严重的不兼容,用起来很不方便。早段时间调一个Grizzly1.3的代码,坦白说,写得不怎么样,代码也比较乱。新版代码,从代码风格上说,改观不少,这也是我决定学习他的原因。
入正题吧。
 
今天调了一上午,总算写成了一个demo, 没有文档,只能参考他的test case,注释我放在了代码里。
 
 
  1. package org.guojje.grizzly;  
  2.  
  3. import java.io.IOException;  
  4.  
  5. import com.sun.grizzly.Controller;  
  6. import com.sun.grizzly.DefaultProtocolChain;  
  7. import com.sun.grizzly.ProtocolFilter;  
  8. import com.sun.grizzly.TCPSelectorHandler;  
  9. import com.sun.grizzly.DefaultProtocolChain.EventHandler;  
  10. import com.sun.grizzly.DefaultProtocolChain.Phase;  
  11. import com.sun.grizzly.filter.EchoFilter;  
  12. import com.sun.grizzly.filter.LogFilter;  
  13. import com.sun.grizzly.filter.ReadFilter;  
  14. import com.sun.grizzly.util.WorkerThreadImpl;  
  15.  
  16. public class Server {  
  17.    public static void main(String args[]) throws IOException{  
  18.      //控制中心,  
  19.      Controller controller = new Controller();  
  20.      //添加SelectorHandler,如果不添加,在Controller.start  
  21.      //的时候,会默认添加TCPSelectorHandler  
  22.        
  23.      TCPSelectorHandler tcpHandler = new TCPSelectorHandler();  
  24.      tcpHandler.setPort(1900);  
  25.      controller.setSelectorHandler(tcpHandler);  
  26.        
  27.      //创建一个协议Chain,  
  28.      DefaultProtocolChain protocolChain = new DefaultProtocolChain();  
  29.  
  30.     //必须添加ReadFilter,不然无法读数据  
  31.      protocolChain.addFilter(new ReadFilter());  
  32.      protocolChain.addFilter(new LogFilter());  
  33.      //添加回显功能  
  34.      protocolChain.addFilter(new EchoFilter());  
  35.      //这里需要注意,ReadFilter,EchoFilter顺序不能倒,先读了数据才能回显。  
  36.      //filter的执行按队列顺序执行。再比如LogFilter,需要放在EchoFilter前面,  
  37.      //不然Buffer里没有数据,LogFilter就没什么数据可LOG了。  
  38.      //这不知道是不是设计的问题。  
  39.  
  40.        
  41.     //添加协议Chain  
  42.     controller.getProtocolChainInstanceHandler().offer(protocolChain);  
  43.     //启动Controller  
  44.     controller.start();  
  45.    }  

启动Server,再启动client,查看console输出,可看到通信成功。

 
  1. package org.guojje.grizzly;  
  2.  
  3. import java.io.IOException;  
  4. import java.net.InetAddress;  
  5. import java.net.InetSocketAddress;  
  6. import java.net.UnknownHostException;  
  7. import java.nio.ByteBuffer;  
  8.  
  9. import com.sun.grizzly.TCPConnectorHandler;  
  10. import com.sun.grizzly.util.OutputWriter;  
  11.  
  12. public class Client {  
  13.     
  14.     public static void main(String[] args) throws UnknownHostException, IOException {  
  15.           
  16.         TCPConnectorHandler tch = new TCPConnectorHandler();  
  17.         tch.connect(new InetSocketAddress(InetAddress.getLocalHost(), 1900));  
  18.         OutputWriter.flushChannel(tch.getUnderlyingChannel(), ByteBuffer.wrap("Hello".getBytes()));  
  19.         ByteBuffer bb = ByteBuffer.allocate(100);  
  20.         tch.read(bb, true);  
  21.         System.out.println(new String(bb.array(),0,bb.remaining()));  
  22.     }  
  23. }  

 本文转自 anranran 51CTO博客,原文链接:http://blog.51cto.com/guojuanjun/651608



相关文章
|
存储 JSON Kubernetes
KubeConfig
KubeConfig 是一个用于存储和管理 Kubernetes 集群配置文件的 JSON 格式文件。它包含了集群的详细信息,如 API 服务器地址、认证信息、命名空间等。KubeConfig 文件的主要作用是让用户能够轻松地在不同的 Kuberne
265 1
|
安全 数据安全/隐私保护
针对一个有意思的钓鱼免杀样本的详细分析
近日跟踪到一个钓鱼样本,比较有意思,沙箱没有跑出行为,如下所示: 做安全,免杀是一个永恒的话题,是一场猫捉老鼠的游戏,通过研究一些对抗型的攻击样本,可以更好的了解攻击者在使用什么技术。
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习中的注意力机制:原理、应用与未来趋势
探索深度学习中的注意力机制:原理、应用与未来趋势
406 0
|
存储 缓存 监控
深入理解Java线程池ThreadPoolExcutor实现原理、数据结构和算法(源码解析)
Java线程池的核心组件包括核心线程数、最大线程数、队列容量、拒绝策略等。核心线程数是线程池长期维持的线程数量,即使这些线程处于空闲状态也不会被销毁;最大线程数则是线程池允许的最大线程数量,当任务队列已满且当前线程数未达到最大线程数时,线程池会创建新线程执行任务;队列容量决定了任务队列的最大长度,当新任务到来时,如果当前线程数已达到核心线程数且队列未满,任务将被放入队列等待执行;拒绝策略则定义了当线程池无法处理新任务时的行为,如抛出异常、丢弃任务等。
250 1
成功解决ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
成功解决ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
|
关系型数据库 MySQL 应用服务中间件
Sqlmap -- POST注入
Sqlmap -- POST注入
306 2
|
监控 Java Linux
java配置OOM时保存堆转储文件
java配置OOM时保存堆转储文件
831 0
|
数据库 微服务 SQL
开发者说 | 分布式事务中间件 Seata 的设计原理
导读 微服务架构体系下,我们可以按照业务模块分层设计,单独部署,减轻了服务部署压力,也解耦了业务的耦合,避免了应用逐渐变成一个庞然怪物,从而可以轻松扩展,在某些服务出现故障时也不会影响其它服务的正常运行。
5300 71
|
Java API
Java:SpringBoot获取所有接口的路由映射关系
Java:SpringBoot获取所有接口的路由映射关系
781 0
|
弹性计算 监控 Oracle
Oracle 21C 使用rpm安装
使用Oracle的rpm安装包安装oracle21C
2450 0
Oracle 21C 使用rpm安装