@(java 技術筆記)
java mina框架的使用和一些自己的理解
1、什么是mina框架及為什么用mina?
官網的解釋為:
Apache Mina Server 是一個網絡通信應用框架,也就是說,它主要是對基於 TCP/IP、UDP/IP協議棧的通信框架(當然,也可以提供 JAVA 對象的序列化服務、虛擬機管道通信服務等),Mina 可以幫助我們快速開發高性能、高擴展性的網絡通信應用,Mina 提供了事件驅動、異步(Mina 的異步 IO 默認使用的是 JAVA NIO 作為底層支持)操作的編程模型。
我自己的理解:
java socket是阻塞的,所以我們要開發高效的網絡通信應用需要使用NIO, 但是NIO的使用操作起來比較復雜。所以mina可以簡單理解為基於Nio的網絡框架。
2、Mina的用法及一些自己的理解?
下面這個是mina 官網對於mina服務端框架的說明:
圖中可以分析出mina服務端框架,可以分為3層。 I/O Acceptor作為連接的接收器, IO Filter作為消息過濾器,I/O Handler作為消息的處理器。
結合這種理解,mina服務器的構建代碼就可以簡化為下面5步。其中MyServerHandler是自定義的類,繼承自mina的org.apache.mina.core.service.IoHandlerAdapter類。
還有一點就是,mina框架中,服務器和客戶端的連接狀態及交互是用IoSession對象進行的,mina會為每一個客戶端連接創建一個IoSession對象,然后把他保存到內存中。直到這個連接斷開。try {
// 第一步 構建socekt連接對象NioSocketAcceptor
NioSocketAcceptor acceptor=new NioSocketAcceptor();
// 第二步設置消息處理器,可以自定義
acceptor.setHandler(new MyServerHandler());
//第三步 設置消息過濾器,可以自定義
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
//第四步 設置連接對象 session的相關設置
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);
//第五步 綁定服務器端口,並啟動服務器
acceptor.bind(new InetSocketAddress(9898));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
自定義的消息處理器:
mina的消息處理器常用的幾個方法如下,方法的作用和方法名基本相同。 需要注意的就是,每個消息處理器的回調中都包含一個IoSession對象, 每一個客戶端連接對應一個IoSession對象。public class MyServerHandler extends IoHandlerAdapter {
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
System.out.println("exceptionCaught");
}
public void messageReceived(IoSession session, Object message)
throws Exception {
String s=(String)message;
System.out.println("messageReceived:"+s);
session.write("server reply:"+ s);
}
public void messageSent(IoSession session, Object message) throws Exception {
String s=(String)message;
System.out.println("messageSent:"+s);
}
public void sessionClosed(IoSession session) throws Exception {
System.out.println("sessionClosed");
}
public void sessionCreated(IoSession session) throws Exception {
System.out.println("sessionCreated");
System.out.println("session:"+session.toString());
}
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
System.out.println("sessionIdle");
}
public void sessionOpened(IoSession session) throws Exception {
System.out.println("sessionOpened");
}
}