Apache Mina 文档翻译 - 第六章 - 传输协议

第六章 - 传输协议

前面的章节中我们已经接触到了TCP和UDP传输协议。这章中我们主要关注一下APR和串口通信。

APR传输

APR (Apache Portable Runtime - Apache可移植运行环境)具有很好的可延展性和性能并且能同原生的服务器技术整合在一起。MINA中提供了对APR的支持。下面我们通过一个时间服务器的例子来学习怎么在MINA中使用APR传输。

前提条件

APR传输依赖于以下组件
APR库 - 从http://www.apache.org/dist/tomcat/tomcat-connectors/native/下载和正确安装APR库
JNI wrapper (tomcat-apr-5.5.23.jar) 在tomcat的发布包中可以找到
最后需要把原生库加到PATH里

使用APR传输

参考下面的时间服务器的例子:

利用普通的NIO的Acceptor的时间服务器的代码是这样的:

IoAcceptor acceptor = new NioSocketAcceptor();

acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));

acceptor.setHandler(  new TimeServerHandler() );

acceptor.getSessionConfig().setReadBufferSize( 2048 );
acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );

acceptor.bind( new InetSocketAddress(PORT) );

 

利用APR的Acceptor的时间服务器代码是这样的:

IoAcceptor acceptor = new AprSocketAcceptor();

acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));

acceptor.setHandler(  new TimeServerHandler() );

acceptor.getSessionConfig().setReadBufferSize( 2048 );
acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );

acceptor.bind( new InetSocketAddress(PORT) );

 

我们只是简单的NioSocketAcceptor替换成AprSocketAcceptor就可以了。这样我们的时间服务器就是在使用APR作为传输层。剩下的部分和原来的用法是一致的。

串口通信

从MINA2.0开始你可以像使用TCP/IP协议一样进行串口通讯。

前提条件

在从Java程序访问串口之前你需要原生库(根据的操作系统可能是.DLL或.so文件)。MINA使用RXTX.org的原生库(ftp://ftp.qbang.org/pub/rxtx/rxtx-2.1-7-bins-r2.zip.
) 你可以把.dll或.so文件放到JDK/JRE的jre/lib/i386/目录或使用Djava.library.path= argument 指定你的原生库的位置。

mina-transport-serial jar没有包含在MINA的发布包中。你可以从下面的地址下载:http://repo1.maven.org/maven2/org/apache/mina/mina-transport-serial/2.0.7/

连接到串口

因为串口通信是一对一的通信, MINA里只提供了一个IoConnector的实现SerialConnector。使用方法如下:

// create your connector
IoConnector connector = new SerialConnector()
connector.setHandler( ... here your buisness logic IoHandler ... );

 
SocketConnector的使用方法和其他的SerialConnector并没有什么不同。

首先我们先要创建一个SerialAddress。

SerialAddress portAddress=new SerialAddress( "/dev/ttyS0", 38400, 8, StopBits.BITS_1, Parity.NONE, FlowControl.NONE );

 

第一个参数是串口的识别符。在Windows上被叫做"COM1", "COM2"等, 在Linux和其他Unix被叫做 "/dev/ttyS0", "/dev/ttyS1", "/dev/ttyUSB0"。

剩下的参数依赖你的串口设备:

    波特率
    数据位
    校验
    流量控制机制

上面的地址创建完成以后:

ConnectFuture future = connector.connect( portAddress );
future.await();
IoSession sessin = future.getSession();

 

然后就和其他的IoConnector一样使用了。关于RS232的详细信息参见:http://en.wikipedia.org/wiki/RS232

相关推荐