1.什麼是MINA?
1.3Mina的現有應用
1.類NioSocketAcceptor
用於創建服務端監聽
2.類NioSocketConnector
用於創建客戶端連接;
3.類IoSession
用來保存會話屬性和發送消息;可以理解爲服務器與客戶端的特定連接,該連接由服務器地址、端口以及客戶端地址、端口來決定。客戶端發起請求時,指定服務器地址和端口,客戶端也會指定或者根據網絡路由信息自動指定一個地址、自動分配一個端口。這個地址、端口對構成一個Session。
5.類IoFilter
IoFilter用來對客戶的請求或發送給客戶的數據進行filter。與IoHandler一樣,Filter也是基於事件的,通過實現IoFilter接口,就可以對通信過程中的Session的事件進行處理。
6.Event
MINA可以看成是事件驅動的。通常在網絡通訊中,可以將整個過程劃分爲幾個基本的階段,如建立連接、數據通信、關閉連接。
數據通信一般包括數據的發送和接收,由於在通信過程中,可能要多次發送和接收數據,以進行不同的業務交互。不可能一直都接收和發送數據,因此就有Idle出現,在MINA中,如果在設定的時間內沒有數據發送或接收,那麼就會觸發一個Idle事件。由於某種原因,可能會發生錯誤,導致系統異常發生,引發exception。因此,如果從事件發生的角度看的話,就可以在MINA中將通信看成由一個建立鏈接(sessionCreated 和 sessionOpened )、多個數據接收和發送、一個關閉連接事件以及多個Idle事件等7種事件組成的過程。
Session是對雙方相互通信的抽象,因此通信的過程就是一系列與Session相關的事件。
在MINA現在對TCP的實現中,sessionCreated 和 sessionOpened 沒有區別。因此嚴格來說,有6種類型的事件。
三、代碼事例
功能描述:編寫一個服務器監聽客戶機的程序,當客戶機訪問服務器的時候,服務器輸出客戶機的訪問信息(http),然後將訪問信息和第幾位客戶告訴客戶機。
處理器代碼:
SamplMinaServerHandler.java
package com.javake.mina.sampleserver;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
public class SamplMinaServerHandler extends IoHandlerAdapter {
//當一個客端端連結進入時
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("incomming client : "+session.getRemoteAddress());
}
//當一個客戶端關閉時
@Override
public void sessionClosed(IoSession session) {
System.out.println("one Clinet Disconnect !");
}
//當客戶端發送的消息到達時:
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
//我們己設定了服務器解析消息的規則是一行一行讀取,這裏就可轉爲String:
String s=(String)message;
// Write the received data back to remote peer
System.out.println("收到客戶機發來的消息: "+s);
//測試將消息回送給客戶端
session.write(s+count);
count++;
}
private int count=0;
}
啓動服務器的主類:
MainServer.java
package com.javake.mina.sampleserver;
import java.net.InetSocketAddress;
import org.apache.mina.common.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class MainServer {
public static void main(String[] args) throws Exception {
//創建一個非阻塞的Server端Socket,用NIO
SocketAcceptor acceptor = new NioSocketAcceptor();
//創建接收數據的過濾器
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//設定這個過濾器將一行一行(/r/n)的讀取數據
chain.addLast("myChin", new ProtocolCodecFilter(new TextLineCodecFactory()));
//設定服務器端的消息處理器:一個SamplMinaServerHandler對象,
acceptor.setHandler(new SamplMinaServerHandler());
// 服務器端綁定的端口
int bindPort=9988;
//綁定端口,啓動服務器
acceptor.bind(new InetSocketAddress(bindPort));