Grizzly是基于JAVA NIO的网络通信框架,网上一些网友的测试来看,grizzly的性能比较好。
所以决定学习一下这个framework.
Grizzly目前有两个版本,一个是1.9.x,一个2.x. 目前除了2.x还有一些Guide外,1.9及其早期版本都没有文档,网上资料相对MINA要少得多。
更不可思议的是,Grizzly的每个版本的API,变化都非常大(没见过这么玩的),严重的不兼容,用起来很不方便。早段时间调一个Grizzly1.3的代码,坦白说,写得不怎么样,代码也比较乱。新版代码,从代码风格上说,改观不少,这也是我决定学习他的原因。
入正题吧。
今天调了一上午,总算写成了一个demo, 没有文档,只能参考他的test case,注释我放在了代码里。
- package org.guojje.grizzly;
- import java.io.IOException;
- import com.sun.grizzly.Controller;
- import com.sun.grizzly.DefaultProtocolChain;
- import com.sun.grizzly.ProtocolFilter;
- import com.sun.grizzly.TCPSelectorHandler;
- import com.sun.grizzly.DefaultProtocolChain.EventHandler;
- import com.sun.grizzly.DefaultProtocolChain.Phase;
- import com.sun.grizzly.filter.EchoFilter;
- import com.sun.grizzly.filter.LogFilter;
- import com.sun.grizzly.filter.ReadFilter;
- import com.sun.grizzly.util.WorkerThreadImpl;
- public class Server {
- public static void main(String args[]) throws IOException{
- //控制中心,
- Controller controller = new Controller();
- //添加SelectorHandler,如果不添加,在Controller.start
- //的时候,会默认添加TCPSelectorHandler
- TCPSelectorHandler tcpHandler = new TCPSelectorHandler();
- tcpHandler.setPort(1900);
- controller.setSelectorHandler(tcpHandler);
- //创建一个协议Chain,
- DefaultProtocolChain protocolChain = new DefaultProtocolChain();
- //必须添加ReadFilter,不然无法读数据
- protocolChain.addFilter(new ReadFilter());
- protocolChain.addFilter(new LogFilter());
- //添加回显功能
- protocolChain.addFilter(new EchoFilter());
- //这里需要注意,ReadFilter,EchoFilter顺序不能倒,先读了数据才能回显。
- //filter的执行按队列顺序执行。再比如LogFilter,需要放在EchoFilter前面,
- //不然Buffer里没有数据,LogFilter就没什么数据可LOG了。
- //这不知道是不是设计的问题。
- //添加协议Chain
- controller.getProtocolChainInstanceHandler().offer(protocolChain);
- //启动Controller
- controller.start();
- }
- }
启动Server,再启动client,查看console输出,可看到通信成功。
- package org.guojje.grizzly;
- import java.io.IOException;
- import java.net.InetAddress;
- import java.net.InetSocketAddress;
- import java.net.UnknownHostException;
- import java.nio.ByteBuffer;
- import com.sun.grizzly.TCPConnectorHandler;
- import com.sun.grizzly.util.OutputWriter;
- public class Client {
- public static void main(String[] args) throws UnknownHostException, IOException {
- TCPConnectorHandler tch = new TCPConnectorHandler();
- tch.connect(new InetSocketAddress(InetAddress.getLocalHost(), 1900));
- OutputWriter.flushChannel(tch.getUnderlyingChannel(), ByteBuffer.wrap("Hello".getBytes()));
- ByteBuffer bb = ByteBuffer.allocate(100);
- tch.read(bb, true);
- System.out.println(new String(bb.array(),0,bb.remaining()));
- }
- }