Mina框架入门demo

来源:互联网 发布:c 高级编程第8版 pdf 编辑:程序博客网 时间:2024/06/10 20:07

第一次接触Mina框架,通过阅读相关博客和文档,自己总结下搭建的过程。

本次建立一个普通工程,也可以使用maven。
jar包引入:

这里写图片描述

只需要引入图上4个jar即可。

Mina客户端代码:

package com.hbk.mina;import java.net.InetSocketAddress;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.textline.TextLineCodecFactory;import org.apache.mina.transport.socket.nio.NioSocketConnector;/** * Mina客户端 * @author 黄宝康 * 2017年9月30日 下午2:09:58 */public class MinaClient {    public static void main(String[] args) {        // 创建TCP/IP连接        NioSocketConnector connection = new NioSocketConnector();        // 创建接受收据的过滤器        DefaultIoFilterChainBuilder chain = connection.getFilterChain();        // 往过滤器链的最后加入一个一行一行读取数据的过滤器        chain.addLast("mychin", new ProtocolCodecFilter(new TextLineCodecFactory()));        // 客户端消息处理器        connection.setHandler(new MinaClientHandler());        // 设置超时时间        connection.setConnectTimeout(5000);        // 连接到服务器        ConnectFuture cf = connection.connect(new InetSocketAddress("localhost", 8080));        // 等待连接完成        cf.awaitUninterruptibly();        cf.getSession().getCloseFuture().awaitUninterruptibly();        connection.dispose();    }}

这里写图片描述

客户端业务处理

package com.hbk.mina;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;/** * 客户端业务处理逻辑 *  * @author 黄宝康 2017年9月30日 下午2:48:24 */public class MinaClientHandler extends IoHandlerAdapter {    // 当客户端连接进入时    @Override    public void sessionOpened(IoSession session) throws Exception {        System.out.println("incomming 客户端: " + session.getRemoteAddress());        session.write("i am coming");    }    @Override    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {        System.out.println("客户端发送信息异常....");    }    // 当客户端发送消息到达时    @Override    public void messageReceived(IoSession session, Object message) throws Exception {        System.out.println("服务器返回的数据:" + message.toString());    }    @Override    public void sessionClosed(IoSession session) throws Exception {        System.out.println("客户端与服务端断开连接.....");    }    @Override    public void sessionCreated(IoSession session) throws Exception {        System.out.println("one Client Connection" + session.getRemoteAddress());        session.write("我来了······");    }}

服务端

package com.hbk.mina;import java.net.InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.core.service.IoAcceptor;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.textline.TextLineCodecFactory;import org.apache.mina.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;/** * Mina服务端 * @author 黄宝康 * 2017年9月30日 下午2:52:27 */public class MinaServer {    // 服务器监听端口        private static final int PORT = 8080;        public static void main(String[] args) {        // 服务器端的主要对象        IoAcceptor acceptor = new NioSocketAcceptor();        // 设置过滤器        acceptor.getFilterChain().addLast("logger", new LoggingFilter());        // 协议解析,采用mina现成的UTF-8字符串处理方式         acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));        // 设置消息处理类(创建、关闭Session,可读可写等等,继承自接口IoHandler)         acceptor.setHandler(new TimeServerHandler());        // 设置接受缓冲区大小        acceptor.getSessionConfig().setReadBufferSize(2048);        // 读写通道无任何操作就进入空闲状态        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);        try {                // 服务器开始监听                acceptor.bind( new InetSocketAddress(PORT) );            }catch(Exception e){                e.printStackTrace();            }      }}

服务端处理类

package com.hbk.mina;import java.util.Date;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;public class TimeServerHandler extends IoHandlerAdapter {    @Override    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {        cause.printStackTrace();    }    /*     * 这个方法是目前这个类里最主要的, 当接收到消息,只要不是quit,就把服务器当前的时间返回给客户端 如果是quit,则关闭客户端连接     */    @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();        System.out.println("hello" + str + session.getRemoteAddress() + date.toString());        session.write("huangbaokang");        System.out.println("Message written...");    }    @Override    public void sessionClosed(IoSession session) throws Exception {        // TODO Auto-generated method stub        super.sessionClosed(session);        System.out.println("客户端与服务端断开连接.....");    }}

测试运行:

这里写图片描述

这里写图片描述