MINA框架例子

每天寫篇博客。每天向某某打卡。保持熱情,保持開心。

一.MINA框架:
Apache Mina是一個能夠幫助用戶開發高性能和高伸縮性網絡應用程序的框架。它通過Java nio技術基於TCP/IP和UDP/IP協議提供了抽象的、事件驅動的、異步的API。

二.編寫簡單的MINA程序

  1. 程序目的:實現客戶端與服務端的簡單交互
  2. 程序效果:
  3. Server端
    client端
  4. 源代碼:
    Server.java:
public class Server {
    public static void main(String[] args) {
        //創建一個非阻塞的serever端
        SocketAcceptor acceptor = new NioSocketAcceptor();
        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
        //設置一個過濾器,一行一行的讀取數據
        chain.addLast("MyChain",new ProtocolCodecFilter(new TextLineCodecFactory()));
        //設定過濾器以對象爲讀取單位
        //chain.addLast("objectFilter",new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));

        //設置服務器端的消息處理器
        acceptor.setHandler(new MinaServerHandler());
        int port = 9998;
        try {
            //綁定端口,啓動服務器(不會阻塞,立即返回)
            acceptor.bind(new InetSocketAddress(port));
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("Mina Server is running,listening on port:"+port);
    }
}

MinaServerHandler.java:

public class MinaClientHandler extends IoHandlerAdapter {
    @Override
    public void sessionOpened(IoSession session) throws Exception {
        super.sessionOpened(session);
        System.out.println("我連接到服務器:" + session.getRemoteAddress() + "了");
    }

    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        super.messageReceived(session, message);
        String info = (String) message;
        System.out.println("服務器對我說:" + info);
//        Message msg = (Message) message;
//        System.out.println("收到"+msg.toString());
        //session.write("收到了!辣雞!");
    }

    @Override
    public void sessionClosed(IoSession session) throws Exception {
        super.sessionClosed(session);
        System.out.println("會話關閉了");
    }
}

Client.java:

public class Client {
    public static void main(String[] args) {
        //創建連接
        NioSocketConnector connector = new NioSocketConnector();
        DefaultIoFilterChainBuilder chain = connector.getFilterChain();
        chain.addLast("mychain",new ProtocolCodecFilter(new TextLineCodecFactory()));

        //設定過濾器以對象爲讀取單位
        //chain.addLast("objectFilter",new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));

        connector.setHandler(new MinaClientHandler());
        connector.setConnectTimeoutMillis(1000*10);
        //連接服務器
        ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 9998));
        cf.awaitUninterruptibly();//等待連接成功
        Scanner input = new Scanner(System.in);
        while (true){
            System.out.println("你要對服務器說什麼?請輸入:");
            String info = input.nextLine();
            //發送消息
            cf.getSession().write(info);
//            //以對象的方式傳輸數據
//            Message msg = new Message();
//            System.out.println("From:");
//            msg.setFrom(input.nextLine());
//            System.out.println("To:");
//            msg.setTo(input.nextLine());
//            System.out.println("info:");
//            msg.setInfo(input.nextLine());
//            System.out.println("type:");
//            msg.setInfo("send");
//            cf.getSession().write(msg);

        }
        //等待服務器連接關閉,結束長連接
        //cf.getSession().getCloseFuture().awaitUninterruptibly();
        //connector.dispose();

    }
}

MinaClientHandler.java:

public class MinaServerHandler extends IoHandlerAdapter {
    //一次回話打開
    @Override
    public void sessionOpened(IoSession session) throws Exception {
        super.sessionOpened(session);
        System.out.println("hello,client" + session.getRemoteAddress());
    }

    //一次回話結束
    @Override
    public void sessionClosed(IoSession session) throws Exception {
        super.sessionClosed(session);
        System.out.println("goodbye,client" + session.getRemoteAddress());
    }

    //接收消息的方法
    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        super.messageReceived(session, message);//接收到的消息對象
        String msg = (String) message;//
        //Message msg = (Message) message;
        System.out.println("收到客戶端消息:" + msg);
        //msg.setInfo("滾");
        session.write("滾");//向客戶端發送消息對象
    }
}

message類:

public class Message implements Serializable {

    private String From;
    private String To;
    private String Type;
    private String info;

    @Override
    public String toString() {
        return "Message{" +
                "From='" + From + '\'' +
                ", To='" + To + '\'' +
                ", Type='" + Type + '\'' +
                ", info='" + info + '\'' +
                '}';
    }
    ....
    }
發佈了35 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章