第六章 - 传输协议
前面的章节中我们已经接触到了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