MINA框架与tomcat的整合

时间:2022-09-10 19:58:51

上篇文章中主要讲了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的客户端和服务器端的编码格式必须保持一致,否则将造成无法接收到消息