Spring+Mina(六)
来源:互联网 发布:手机变号码软件 编辑:程序博客网 时间:2024/05/17 03:48
pom.xml引入相应的包
<!-- apache mina --> <dependency> <groupId>org.apache.mina</groupId> <artifactId>mina-core</artifactId> <version>${mina.version}</version> </dependency> <dependency> <groupId>org.apache.mina</groupId> <artifactId>mina-integration-beans</artifactId> <version>${mina.version}</version> </dependency> <dependency> <groupId>org.apache.mina</groupId> <artifactId>mina-integration-spring</artifactId> <version>1.1.7</version> </dependency>
MINA的配置文件spring-mina.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="customEditors"> <map> <entry key="java.net.SocketAddress" value="org.apache.mina.integration.beans.InetSocketAddressEditor" /> </map> </property> </bean> <!-- the IoFilters --> <bean id="executorFilter" class="org.apache.mina.filter.executor.ExecutorFilter" /> <bean id="mdcInjectionFilter" class="org.apache.mina.filter.logging.MdcInjectionFilter"> <constructor-arg value="remoteAddress" /> </bean> <bean id="codecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter"> <constructor-arg> <ref bean="messageCodecFactory" /> </constructor-arg> </bean> <bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter" /> <!-- The non-SSL filter chain. --> <bean id="filterChainBuilder" class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder"> <property name="filters"> <map> <entry key="executor" value-ref="executorFilter" /> <entry key="mdcInjectionFilter" value-ref="mdcInjectionFilter" /> <entry key="codecFilter" value-ref="codecFilter" /> <entry key="loggingFilter" value-ref="loggingFilter" /> </map> </property> </bean> <!-- The IoAcceptor --> <bean id="tcpAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor" lazy-init="false" init-method="bind" destroy-method="unbind"> <property name="defaultLocalAddress" value="${socket.tcp.port}" /> <property name="handler" ref="tcpHandler" /> <property name="reuseAddress" value="true" /> <property name="filterChainBuilder" ref="filterChainBuilder" /> </bean> <bean id="udpAcceptor" class="org.apache.mina.transport.socket.nio.NioDatagramAcceptor" lazy-init="false" init-method="bind" destroy-method="unbind"> <property name="defaultLocalAddress" value="${socket.udp.port}" /> <property name="handler" ref="udpHandler" /> <property name="filterChainBuilder" ref="filterChainBuilder" /> </bean></beans>
需要注意的是tcp的监听reuserAddress要设置成true,否则可能重启后,端口显示占用。
MessageCodecFactory负责处理发送和接收的ip包,包含解码和编码两部分。
MessageCodecFactory.java
@Component("messageCodecFactory")public class MessageCodecFactory implements ProtocolCodecFactory { private final MessageEncoder encoder; private final MessageDecoder decoder; public MessageCodecFactory() { encoder = new MessageEncoder(); decoder = new MessageDecoder(); } @Override public ProtocolEncoder getEncoder(IoSession session) throws Exception { return encoder; } @Override public ProtocolDecoder getDecoder(IoSession session) throws Exception { return decoder; }}MessageDecoder.java 处理解码,粘包 拆包都在这里面进行。我们简单处理,直接把收到的信息转成字符串。
protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { in.order(ByteOrder.LITTLE_ENDIAN); int length = in.limit(); byte[] bytes = new byte[length]; in.get(bytes); String data = new String(bytes, "GBK"); out.write(data); return true; }
TcpHandler是具体负责处理消息解析的逻辑块,当发送消息后,messageReceived会响应。
@Service("tcpHandler")public class TcpHandler extends IoHandlerAdapter { @Override public void sessionCreated(IoSession session) throws Exception { //获取请求ip ((InetSocketAddress)session.getRemoteAddress()).getAddress().getHostAddress(); } @Override public void sessionOpened(IoSession session) throws Exception { // Empty handler } @Override public void sessionClosed(IoSession session) throws Exception { // Empty handler } @Override public void sessionIdle(IoSession session, IdleStatus status) throws Exception { session.closeOnFlush(); String errorMsg = status.equals(IdleStatus.READER_IDLE) ? "Read idle timeout" : "Write idle timeout"; logger.debug(errorMsg + ", connection closed!"); } @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { super.exceptionCaught(session, cause); session.closeOnFlush(); } @Override public void messageReceived(IoSession session, Object message) throws Exception { final String msg = ((String) message).trim(); if(msg.length() <= 500) { logger.debug("Receive TCP << " + msg); } else { logger.debug("Receive TCP << " + msg.substring(0, 500) + "..."); } //具体的处理逻辑放在这 if(out == null) { session.closeNow(); //关闭连接 } else { session.write(out); logger.debug("Send TCP >> " + out); } }}
0 0
- Spring+Mina(六)
- Mina框架学习笔记(六)
- apache mina 学习(六)-----session
- Mina框架学习笔记(六)
- mina源码分析六(转)
- Mina框架学习笔记(六)
- Spring MINA
- spring + mina
- mina与spring集成(翻译)
- Mina源码阅读笔记(六)—Mina异步IO的实现IoFuture
- Mina源码阅读笔记(六)—Mina异步IO的实现IoFuture
- Mina源码阅读笔记(六)—Mina异步IO的实现IoFuture
- Mina、Netty、Twisted一起学(六):session
- MINA、Netty、Twisted一起学(六):session
- spring security(六)
- 初识spring(六)
- Apache MINA + Spring
- spring+hibernate+mina
- 图的邻接表基本操作
- Windows的程序性能分析和函数呼叫列表工具LTProf (Call Graph at Runtime)
- 浏览器兼容平台f2etest搭建详细记录
- StrutsPrepareAndExecuteFilter中excludedPatterns变量的用法
- sql 资料杂记
- Spring+Mina(六)
- SQL Server 2008——再谈主键和外键
- C++ map,set内部数据结构
- objective-c启用ARC时的内存管理
- 广度优先算法
- 1022. Digital Library (30)
- spring mvc 工作流程
- Java并发编程:synchronized
- 实习入职第六天:getFields()和getDeclaredFields()