1. 程式人生 > >Mina 第一個mina程序(一)

Mina 第一個mina程序(一)

session flush 讀寫 @override value handle jar conn nco

引入兩個jar包 :

mina-core-2.0.3.jar

slf4j-api-1.6.0.jar

服務端編寫 : Server和handler

Server:

public class MyServer {

    public static void main(String[] args) throws IOException {

        // 初始化了服務端的TCP/IP 的基於NIO 的套接字
        //IoAcceptor的抽象是IoServivce :服務端
        IoAcceptor acceptor = new NioSocketAcceptor();
        
// 調用IoSessionConfig設置讀取數據的緩沖區大小 acceptor.getSessionConfig().setReadBufferSize(2048); // 讀寫通道均在10 秒內無任何操作就進入空閑狀態 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); // 在bind前執行的準備工作 // TextLineCodecFactory 編解碼器工廠來對字符串進行編解碼處理。 acceptor.getFilterChain().addLast("codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()))); acceptor.setHandler(new MyIoHandler()); acceptor.bind(new InetSocketAddress(9123)); } }

handler :

public class
MyIoHandler extends IoHandlerAdapter{ // 這裏我們使用的SLF4J作為日誌門面,至於為什麽在後面說明。 private final static Logger log = LoggerFactory.getLogger(MyIoHandler.class); @Override public void messageReceived(IoSession session, Object message) throws Exception { String str = message.toString(); //簡單打印客戶端傳過來的數據 System.out.println("The message received is [" + str + "]"); if (str.endsWith("quit")) { session.close(true); return; } } @Override public void sessionCreated(IoSession session) throws Exception { System.out.println("session create"); } @Override public void sessionClosed(IoSession session) throws Exception { System.out.println("session closed"); } }

客戶端編寫 :client 和handler

client:

public class MyClient {
    
    //編寫IoService並註冊過濾器
    public static void main(String[] args) {
        
        //IoConnector的抽象是IoServivce:客戶端
        IoConnector connector = new NioSocketConnector();
        connector.setConnectTimeoutMillis(30000);
        connector.getFilterChain().addLast("codec",
                new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),
                        LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue())));
        
        //為IoService註冊Handler
        connector.setHandler(new ClientHandler("你好!\r\n 大家好!"));
        
        connector.connect(new InetSocketAddress("localhost", 9123));
            
        
    }
}

handler:

public class ClientHandler extends IoHandlerAdapter{

    private final static Logger LOGGER = LoggerFactory.getLogger(ClientHandler.class);
    
    private final String values;

    public ClientHandler(String values) {
        this.values = values;
    }
    
    @Override
    public void sessionOpened(IoSession session) throws Exception {
        session.write(values);
    }
    
}

mina重要對象介紹 :

IoService對象

        //IoService的常用方法
        //獲取傳輸方式的元數據描述信息,也就是底層到底基於什麽的實現,譬如:nio、apr 等。
        TransportMetadata transportMetadata = connector.getTransportMetadata();
        //增加刪除一個監聽器:監聽IoService 的創建、活動、失效、空閑、銷毀
        //參考IoServiceListener 接口中的方法,這為你參與IoService 的生命周期提供了機會
        connector.addListener(null);
        connector.removeListener(null);
        //獲取IoService上管理的所有IoSession,Map的key是IoSession的id
        Map<Long ,IoSession> maps = connector.getManagedSessions();
        //獲取IoSession的配置對象:讀數據的緩存大小,多少秒進入空閑狀態
        connector.getSessionConfig();
        
        //1.IoAcceptor 服務端的IoService 增加bind端口方法
        //2.IoConnector 客戶端的IoService 增加connect與server建立連接
        

IoSession對象

    //IoSession : 這個接口用於表示Server 端與Client 端的連接
    @Override
    public void sessionOpened(IoSession session) throws Exception {
        
        //這個方法用於寫數據,該操作是異步的。
        session.write(values);
        //關閉IoSession,該操作也是異步的,參數指定true 表示立即關閉,否則就在所有的寫操作都flush 之後再關閉。
        session.close();
        //向會話中添加一些屬性,這樣可以在會話過程中都可以使用,
        //類似於HttpSession 的setAttrbute()方法。IoSession 內部使用同步的HashMap 存儲你添加的自定義屬性。
        session.setAttribute("設置屬性");
        //獲取遠端連接的套接字地址
        session.getRemoteAddress();
        //用於掛起寫操作,那麽有void resumeWrite()方法與之配對。對於read()方法同樣適用。
        session.suspendWrite();
        //用於讀取數據, 但默認是不能使用的, 你需要調用IoSessionConfig 的
        //setUseReadOperation(true)才可以使用這個異步讀取的方法。一般我們不會用到這個方法,
        //因為這個方法的內部實現是將數據保存到一個BlockingQueue,假如是Server 端,因為大
        //量的Client 端發送的數據在Server 端都這麽讀取,那麽可能會導致內存泄漏,但對於
        //Client,可能有的時候會比較便利。
//        session.read();
        //返回與當前會話對象關聯的IoService 實例
        session.getService();
        
    }

Mina 第一個mina程序(一)