上篇文章中主要讲了mina框架如何在main函数中使用,但是实际运用中,许多web项目都是通过tomcat启动的,因此就需要把mina框架整合到tomcat中。本篇主要写一下mina如何在tomcat中启动,web使用到的框架是Spring + SpringMvc + Mybatis框架。
在tomcat中启动MINA分以下3步:
1、在web.xml中配置启动监听类,其中,XXX.MINAListener为自定义的监听类,在服务启动的时候运行。XXX.MINAListener要写全路径的类名。
<listener>
<listener-class>XXX.MiNaListener</listener-class>
<listener>
2、MiNaListener类要实现ServletContextListener类,在contextInitialized方法里配置MINA服务器的启动参数。
package test.mina;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class MiNaListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// 4步操作
//1 新建NioSocketAcceptor实例对象
IoAcceptor acceptor = new NioSocketAcceptor();
// 2.设置读取缓存大小
acceptor.getSessionConfig().setReadBufferSize(2048);
// 设置响应时常,读写通道均在10秒内无任何操作进如空闲状态
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
// 3.设置消息处理对象
acceptor.setHandler(new MyServerHandler());
// 设置所使用的的字符编码格式
acceptor.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(),
LineDelimiter.WINDOWS.getValue())));
// 4.绑定端口
try {
// 绑定端口开启服务
acceptor.bind(new InetSocketAddress(12345));
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、自定义消息处理类,用于接收来自客户端的消息。
自定义MyServerHandler类,处理客户端的消息。
package test.mina;
import java.util.Date;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** * 消息处理类 * @author Administrator */
public class MyServerHandler extends IoHandlerAdapter {
private int count = 0;
private final static Logger log = LoggerFactory .getLogger(MyServerHandler.class);
// 由底层决定是否创建一个session
@Override
public void sessionCreated(IoSession session) throws Exception {
super.sessionCreated(session);
System.out.println("新客户连接");
}
// 创建了session 后会回调sessionOpened
@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
count++;
System.out.println("第 " + count + " 个 client 登陆!address: : " + session.getRemoteAddress());
sessionWrite(session);
}
// 获取session连接,用来随时向客户端发送消息
private void sessionWrite(IoSession session) {
session.write("Sent by Server1" + 1);
}
/** * 收到客户端发送消息以后会回调这个函数 */
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String str = message.toString();
log.info("The message received is [" + str + "]");
if (str.endsWith("quit")) {
session.close(true);
return;
}
System.out.println(str);
String str1 = message.toString();
Date date = new Date();
session.write(date.toString());
System.out.println("接收到的数据:" + str1);
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
super.messageSent(session, message);
}
/** * session 关闭的时候被调用 */
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
}
/** * session 空闲的时候被调用 */
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
super.sessionIdle(session, status);
}
/** * 异常捕捉的时候被调用 */
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
super.exceptionCaught(session, cause);
}
}
通过以上步骤,当启动tomcat的时候,相应的mina框架也会启动。不过这里需要注意的有几点:
1、在web.xml中配置的监听类,必须是全路径的类名
2、在MINA框架中配置的端口号不能和tomcat的端口号相同
3、mina的客户端和服务器端的编码格式必须保持一致,否则将造成无法接收到消息