1. 程式人生 > >MINA框架與tomcat的整合

MINA框架與tomcat的整合

上篇文章中主要講了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的客戶端和伺服器端的編碼格式必須保持一致,否則將造成無法接收到訊息