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,注释我放在了代码里。
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()));
}
}
本文出自 “天下无贼” 博客
补充:软件开发 , Java ,