MINA框架在服务器端的应用

  上一篇文章中写了MINA框架在客户端的使用,由于篇幅所限,没有把在服务器中的使用写下来。这篇文章主要写一下MINA如何在服务器中使用。
  MINA框架在服务器端应用,目前我只知道两种部署方式。一种是通过main函数启动,一种是通过tomcat启动。
  网上有很多,都是讲MINA如何在main函数中使用,但是在实际的web项目中,也有很多是通过tomcat来部署服务的。我刚好做了一个web项目,整合了Spring + SpringMVC + Mybatis框架,因此就需要把MINA框架整合到Spring中去。但是网上这方面的整合比较少,能找到的也是一些写的含糊不清的,看了让人摸不到方向。于是我就查资料,结合从网上找来的一些片段试着整合。经过实际运用,还算可行。
  下面我会把MINA通过main函数启动和通过tomcat启动都写下来,防止遗忘。
  首先是通过main函数的启动代码:
  注意:不管是通过哪种方式启动,都需要导入MIAN框架的两个必须的jar包。一个是mina-core-2.0.16.jar和slf4j-api-1.7.21.jar。
 

package com.test.server;

import java.io.IOException;
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.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import com.test.handler.MyServerHandler;

public class TCPServer {

    public static void main(String[] args) {
        // 4部操作
        // 1.新建NioSocketAcceptor实例对象
        IoAcceptor acceptor = new NioSocketAcceptor();
        // 设置读取缓存大小
        acceptor.getSessionConfig().setReadBufferSize(2048);
        // 设置响应时常,读写通道均在10 秒内无任何操作就进入空闲状态
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
        // 2.设置消息处理对象
        acceptor.setHandler(new MyServerHandler());

        acceptor.getFilterChain().addLast(
                "codec",
                new ProtocolCodecFilter(new TextLineCodecFactory(Charset
                        .forName("UTF-8"), LineDelimiter.WINDOWS.getValue(),
                        LineDelimiter.WINDOWS.getValue())));
        try {
            // 绑定端口开启服务
            acceptor.bind(new InetSocketAddress(12345));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

消息处理类如下:

package com.test.handler;

import java.util.Date;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 消息处理类
 * @author Administrator
 */
public class MyServerHandler extends IoHandlerAdapter {

    private int count = 0;
    private final static Logger log = LoggerFactory .getLogger(MyServerHandler.class);

    // 由底层决定是否创建一个session
    @Override
    public void sessionCreated(IoSession session) throws Exception {
        super.sessionCreated(session);
        System.out.println("新客户连接");
    }

    // 创建了session 后会回调sessionOpened
    @Override
    public void sessionOpened(IoSession session) throws Exception {

        super.sessionOpened(session);
        count++;
        System.out.println("第 " + count + " 个 client 登陆!address: : " + session.getRemoteAddress());

        sessionWrite(session);
    }

    // 获取session连接,用来随时向客户端发送消息
    private void sessionWrite(IoSession session) {
        session.write("Sent by Server1" + 1);
    }

    /**
     * 收到客户端发送消息以后会回调这个函数
     */
    @Override
    public void messageReceived(IoSession session, Object message)
            throws Exception {

        String str = message.toString();
        log.info("The message received is [" + str + "]");
        if (str.endsWith("quit")) {
            session.close(true);
            return;
        }
        System.out.println(str);
        String str1 = message.toString();
        Date date = new Date();
        session.write(date.toString());
        System.out.println("接收到的数据:" + str1);
    }

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

    /**
     * session 关闭的时候被调用
     */
    @Override
    public void sessionClosed(IoSession session) throws Exception {
        super.sessionClosed(session);
    }

    /**
     * session 空闲的时候被调用
     */
    @Override
    public void sessionIdle(IoSession session, IdleStatus status)
            throws Exception {
        super.sessionIdle(session, status);
    }

    /**
     * 异常捕捉的时候被调用
     */
    @Override
    public void exceptionCaught(IoSession session, Throwable cause)
            throws Exception {
        super.exceptionCaught(session, cause);
    }

}

  然后启动main函数,把客户端和服务器端的端口号保持一致,就可以通过客户端链接了。
  在tomcat中的启动将在下一篇文章中记录。

猜你喜欢

转载自blog.csdn.net/little_soybean/article/details/79252611
今日推荐