`
dechong
  • 浏览: 16403 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java socket 及 开源框架MINA(二)

阅读更多
3:Socket网络框架 MINA
MINA是一个网络应用框架,在不牺牲性能和可扩展性的前提下用于解决如下问题:
1:快速开发自己的英勇。
2:高可维护性,高可复用性:网络I/O编码,消息的编/解码,业务逻辑互相分离。
3:相对容易的进行单元测试。

3.1 IoFilters:
IoFilter为MINA的功能扩展提供了接口。它拦截所有的IO事件进行事件的预处理和后处理(AOP)。我们可以把它想象成
Servlet的filters。
IoFilter能够实现以下几种目的:
事件日志
性能检测
数据转换(e.g. SSL support),codec
防火墙…等等

3.2 codec: ProtocolCodecFactory
MINA提供了方便的Protocol支持。如上说讲,codec在IoFilters中设置。
通过它的Encoder和Decoder,可以方便的扩展并支持各种基于Socket的网络协议,比如HTTP服务器、FTP服务器、Telnet服务器等等。

要实现自己的编码/解码器(codec)只需要实现interface: ProtocolCodecFactory即可.
在MINA 1.0版本,MINA已经实现了几个常用的(codec factory):

DemuxingProtocolCodecFactory,
NettyCodecFactory,
ObjectSerializationCodecFactory,
TextLineCodecFactory

其中:
TextLineCodecFactory:
A ProtocolCodecFactory that performs encoding and decoding between a text line data and a Java
string object. This codec is useful especially when you work with a text-based protocols such as SMTP and IMAP.

ObjectSerializationCodecFactory:
A ProtocolCodecFactory that serializes and deserializes Java objects. This codec is very useful when
you have to prototype your application rapidly without any specific codec.

DemuxingProtocolCodecFactory:
A composite ProtocolCodecFactory that consists of multiple MessageEncoders and MessageDecoders. ProtocolEncoder
and ProtocolDecoder this factory returns demultiplex incoming messages and buffers to appropriate MessageEncoders
and MessageDecoders.

NettyCodecFactory:
A MINA ProtocolCodecFactory that provides encoder and decoder for Netty2 Messages and MessageRecognizers.

3.3 business logic: IoHandler

MINA中,所有的业务逻辑都有实现了IoHandler的class完成
interfaceHandles:
all protocol events fired by MINA. There are 6 event handler methods, and they are all invoked by MINA automatically.
当事件发生时,将触发IoHandler中的方法:
sessionCreated(),
sessionOpened(),
sessionClosed(),
sessionIdle(),
exceptionCaught(),
messageReceived(),
messageSent()


MINA 1.O中,IoHandler的实现类:
ChainedIoHandler,
DemuxingIoHandler,
IoHandlerAdapter,
SingleSessionIoHandlerDelegate,
StreamIoHandler
具体细节可参考javadoc。

3.4   MINA的高级主题:线程模式
MINA通过它灵活的filter机制来提供多种线程模型。
没有线程池过滤器被使用时MINA运行在一个单线程模式。
如果添加了一个IoThreadPoolFilter到IoAcceptor,将得到一个leader-follower模式的线程池。
如果再添加一个ProtocolThreadPoolFilter,server将有两个线程池;
一个(IoThreadPoolFilter)被用于对message对象进行转换,另外一个(ProtocolThreadPoolFilter)被用于处理业务逻辑。
SimpleServiceRegistry加上IoThreadPoolFilter和ProtocolThreadPoolFilter的缺省实现即可适用于需
要高伸缩性的应用。如果想使用自己的线程模型,请参考SimpleServiceRegistry的源代码,并且自己

初始化Acceptor。

  

IoThreadPoolFilter threadPool = new IoThreadPoolFilter();threadPool.start();    
IoAcceptor acceptor = new SocketAcceptor();    
acceptor.getFilterChain().addLast( "threadPool", threadPool);    
ProtocolThreadPoolFilter threadPool2 = new ProtocolThreadPoolFilter();    
threadPool2.start();    
ProtocolAcceptor acceptor2 = new IoProtocolAcceptor( acceptor );    
acceptor2.getFilterChain().addLast( "threadPool", threadPool2 );    
...    
threadPool2.stop();    
threadPool.stop();  

3.5 采用MINA进行socket开发,一般步骤如下:
1:

IoAcceptor acceptor = new SocketAcceptor(); //建立client接收器   
or client:   
SocketConnector connector = new SocketConnector(); //建立一个连接器 

2:server的属性配置:

  
SocketAcceptorConfig cfg = new SocketAcceptorConfig();    
cfg.setReuseAddress(true);    
cfg.getFilterChain().addLast(    
            "codec",    
            new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) ); //对象序列化 codec factory    
cfg.getFilterChain().addLast( "logger", new LoggingFilter() );  

3:绑定address和business logic
server:

  
acceptor.bind(    
        new InetSocketAddress( SERVER_PORT ),    
        new ServerSessionHandler( ), cfg ); // 绑定address和handler    
   
   
connector.connect(new InetSocketAddress( HOSTNAME, PORT ),    
                new ClientSessionHandler(msg), cfg );   
分享到:
评论
1 楼 maozilee 2011-08-22  
还有一个经典的图的。。

相关推荐

Global site tag (gtag.js) - Google Analytics