MINA框架與tomcat的整合
阿新 • • 發佈:2019-02-15
上篇文章中主要講了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的客戶端和伺服器端的編碼格式必須保持一致,否則將造成無法接收到訊息