Java - Apache Mina 簡單示例

襲冷發表於2014-06-30

一、關於

    Apache MINA 是一個網路應用程式框架,它對Java中的socket和NIO進行了有效和清晰的封裝,方便開發人員開發TCP/UDP程式,從而拋開在使用原始的socket時需要考慮的各種繁雜而又煩人問題(執行緒、效能、會話等),把更多精力專著在應用中的業務邏輯的開發上。


二、示例

    1、相關準備

        下載Mina,建立工程,新增mina核心的jar和slf4j的jar

    2、伺服器端

        (1)Main

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class ServerMain {
	
	public static void main(String[] args) throws IOException {
		
		//	監聽連線物件 基於tcp/ip
		IoAcceptor acceptor = new NioSocketAcceptor();

		//	繫結埠
		SocketAddress address = new InetSocketAddress("localhost", 8888);
		
		//	獲取過濾器鏈
		DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
		
		//	新增日誌過濾器
		chain.addLast("logger", new LoggingFilter());
		
		//	配置資料的編解碼器 這裡使用了序列化編解碼工廠 
		chain.addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
		
		acceptor.setHandler(new ServerHandler());
		
		//	繫結伺服器埠 
		acceptor.bind(address);
		
		System.out.println(" 伺服器在 8888 埠監聽.......");
		
	}
}
        (2)Handler

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

/**
 * 自定義Handler需實現IoHandler介面,可通過繼承IoHandlerAdapter來完成
 */
public class ServerHandler extends IoHandlerAdapter{

	@Override
	public void messageReceived(IoSession session, Object message) throws Exception {
		// 接受訊息
		System.out.println("伺服器端接接收到的訊息:" + message.toString());
	}

	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		// 傳送訊息
		super.messageSent(session, message);
	}

	@Override
	public void sessionOpened(IoSession session) throws Exception {
		// 已建立會話
		System.out.println("客戶端已連線...");
		session.write("歡迎到連線Mina伺服器!!!");  //這裡也可以傳送其他實現了Serializable介面的物件
	}
}
    3、客戶端

        (1)Main

import java.net.InetSocketAddress;
import java.net.SocketAddress;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

public class ClientMain {
	public static void main(String[] args) {
		
		//	建立連線物件,基於tcp/ip
		NioSocketConnector connector = new NioSocketConnector();
		
		SocketAddress address = new InetSocketAddress("localhost", 8888);

		//	獲取過濾器鏈
		DefaultIoFilterChainBuilder chain = connector.getFilterChain();

		//	新增日誌過濾器
		chain.addLast("logger", new LoggingFilter());
		
		//	配置資料的編解碼器 
		chain.addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));

		//	IoHandler的作用: 業務處理的裝置
		//	新增Handler
		connector.setHandler(new ClientHandler());

		//	連線到伺服器 
		ConnectFuture future = connector.connect(address);
		
		//	等待資料傳送完畢
		future.awaitUninterruptibly();

		//	關閉連線
		//	connector.dispose();

	}
}
        (2)Handler

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

public class ClientHandler extends IoHandlerAdapter{

	@Override
	public void messageReceived(IoSession session, Object message) throws Exception {
		// 接收
		System.out.println("客戶端接收到的訊息:" + message);
		
	}

	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		// 傳送 
		super.messageSent(session, message);
	}

	@Override
	public void sessionOpened(IoSession session) throws Exception {
		// 已建立會話
		System.out.println("已經連線到了伺服器....");
		session.write("Mina伺服器端,你好!!!");
	}
	
}
    3、結果

        (1)伺服器端

            

        (2)客戶端

            

三、說明

    IoFilter的作用:接收資料,編/解碼,將資料傳遞到邏輯層

    IoHandler的作用:業務處理的裝置


四、資源

     http://download.csdn.net/detail/u013379717/7574657

 

 

相關文章