JAVA通訊系列二:mina入門總結,java通訊mina入門

來源:互聯網
上載者:User

JAVA通訊系列二:mina入門總結,java通訊mina入門

一、學習資料

Mina入門執行個體(一)
http://www.cnblogs.com/juepei/p/3939119.html

Mina入門教程(二)----Spring4 整合Mina
http://www.cnblogs.com/juepei/p/3940396.html

Apache Mina 入門執行個體——建立一個MINA時間服務
http://loftor.com/archives/apache-mina-quick-start-guide.html


MINA2.0使用者手冊中文版——系列文檔
http://blog.csdn.net/lxlzhn/article/category/1272213/2

mina 心跳機制
出處:http://wandejun1012.iteye.com/blog/2065941

mina架構詳解
http://www.cnblogs.com/gw811/p/4279230.html

mina編碼器詳解
http://wenku.baidu.com/link?url=Pk11Evhi-8NEVx6WCaxzRQJA1yjumNxBjWTS5s2NENHjE1sX16ljnJNv-7mkas5z4rIHrOTgu5Dx-dGdFDnZk-i2W4vMLfbssAy1nrd33AK

Mina系列文章索引(解碼解析等,不錯)
http://my.oschina.net/ielts0909/blog/92716

 

二、程式碼範例
(1)Mina服務端建立步驟
1.建立監聽對象
IoAcceptor acceptor=new NioSocketAcceptor();
2.添加Filter(日誌,編解碼)
acceptor.getFilterChain().addLast("logger",new LoggingFilter());
acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));

3.添加Handler處理
acceptor.setHandler(new TimeServerHandler());

4.設定回話參數【輸入緩衝區Buffer大小,多久進入空閑時間】
acceptor.getSessionConfig.setReadBufferSize(2048);
acceptor.getessionConfig.setIdleTime(IdleStatus.BOTH_IDLE,10);

5.綁定連接埠號碼,開始監聽
acceptor.bind(new InetSocketAddress(PORT));

Handler處理類開發
繼承IOHandler類或者實現IoHandler介面
用戶端Handler,服務端Handler使用同一個IOHandler繼承實現。
public TimeServerHandler extends IoHandlerAdapter
{
@Override
public void exceptionCaught(IoSession session,Throwable cause) throws Exception
{
cause.printStackTrace();
}

@Override
public void messageReceived(IoSession session,Object message) throws Exception
{
String str=message.toString();
if(str.trim().equalsIgnoreCase("quit"))
{
session.close();
return ;
}

Date date=new Date();
session.write(date.toString());
System.out.println("Message written...");
}

@Override
public void sessionIdle(IoSession session,IdleStatus status) throws Exception
{
System.out.println("IDLE"+session.getIdleCount(status));
}
}

exceptionCaught方法:捕獲錯誤,簡單地列印了錯誤的堆疊追蹤和關閉會話。

messageReceived方法:來處理從用戶端接收到的資料,這裡是將目前時間返回給用戶端。根據所使用的協議轉碼器,object 這個參數傳遞的類型有所不同,以及返回的資料時的session.write(Object) 也不同。如果不指定協議的轉碼器,你將收到一個類型為IoBuffer 的對象,返回的資料也要求是IoBuffer。

sessionIdle方法:空閑狀態時,將定時調用一次會話
還有以下幾個方法重寫
    @Override
    public void messageSent(IoSession arg0, Object message) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("client發送資訊"+message.toString());
    }

    @Override
    public void sessionClosed(IoSession session) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("client與:"+session.getRemoteAddress().toString()+"中斷連線");
    }

    @Override
    public void sessionCreated(IoSession session) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("client與:"+session.getRemoteAddress().toString()+"建立串連");
    }

    @Override
    public void sessionOpened(IoSession arg0) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("開啟串連");
    }


(2)Mina用戶端建立
1.建立用戶端連線物件
IoConnector connector=new NioSocketConnector();或者NioSocketConnector connector = new NioSocketConnector();

2.設定過濾器職責鏈(日誌,編解碼【多種轉碼器】)
connector.getFilterChain().addLast("logger",new LoggingFilter());
connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(new PrefixedStringCodecFactory(Charset.forName("UTF-8"))));
也可以使用
ioAcceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));

3.設定Handler處理
connector.setHandler(new TimeClientHandler());

4.建立Connect串連
ConnectFuture connectFuture=connector.connect(new InetSocketAddress("127.0.0.1",BaseConfig.PORT));
connectFuture.awaitUninterruptibly();

5.獲得Session回話
IoSession session=connectFuture.getSession();

6.輸入輸出操作
以下是接收控制台的輸入,獲得後發送到服務端
Scanner sc = new Scanner(System.in);

        boolean quit = false;

        while(!quit){

            String str = sc.next();
            if(str.equalsIgnoreCase("quit")){
                quit = true;
            }
            session.write(str);
        }

7.關閉Session和連接器
        if(session!=null){
            if(session.isConnected()){
                session.getCloseFuture().awaitUninterruptibly();
            }
            connector.dispose(true);
        }
IoConnector connector = new NioSocketConnector();
        connector.getFilterChain().addLast( "logger", new LoggingFilter() );
        connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new PrefixedStringCodecFactory(Charset.forName("UTF-8"))));
        connector.setHandler(new TimeClientHander());
        ConnectFuture connectFuture = connector.connect(new InetSocketAddress("127.0.0.1",BaseConfig.PORT));
        //等待建立串連
        connectFuture.awaitUninterruptibly();
        System.out.println("串連成功");

        IoSession session = connectFuture.getSession();

        Scanner sc = new Scanner(System.in);

        boolean quit = false;

        while(!quit){

            String str = sc.next();
            if(str.equalsIgnoreCase("quit")){
                quit = true;
            }
            session.write(str);
        }

        //關閉
        if(session!=null){
            if(session.isConnected()){
                session.getCloseFuture().awaitUninterruptibly();
            }
            connector.dispose(true);
        }

三、粘包分包處理
有三種常用方法可以將位元組流分離成訊息:
使用固定長度的訊息。
使用固定長度的標題指出訊息內容主體的長度。
使用分隔字元;例如很多基於文本的訊息在訊息的後面追加換行(或者CR LF組合)   (http://www.faqs.org/rfcs/rfc977.html)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.