当前位置:编程学习 > JAVA >>

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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,