springboot整合mina

匆匆过客 提交于 2020-01-14 08:48:10

1、hello world

maven引入jar包

<dependency>
    <groupId>org.apache.mina</groupId>
    <artifactId>mina-core</artifactId>
    <version>2.1.3</version>
</dependency>

①、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;

public class MinaServer {

    public static void main( String[] args ) throws IOException
    {
    	//1、创建IoService,拥有监听是否有客户端链接
    	IoAcceptor acceptor=new NioSocketAcceptor();  
    	//设置缓冲区大小
    	acceptor.getSessionConfig().setReadBufferSize(2048);  
    	//设置空闲状态时间,10秒没操作就进入空闲状态
    	acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);  
    	
    	//2、实现过滤器
    	acceptor.getFilterChain().addLast("test",  
			new ProtocolCodecFilter(
				new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue())
			)  
		);
    	//3、实现IoHandler,并注册到IoService
    	acceptor.setHandler(new MinaServerHandler());  
    	//绑定端口,绑定之前必须设置handler实现类
    	acceptor.bind(new InetSocketAddress(9123)); 
    	
    }
}
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

public class MinaServerHandler extends IoHandlerAdapter {

    @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")) {
            //注意:在这里调用close方法之后,只是关闭当前的tcp连接,server端还正常运行,
        	//需要调用IoService的dispose方法才能关闭server端,client端同理
            session.closeNow();
            return;
        }
    }

    @Override
    public void sessionCreated(IoSession session) throws Exception {
        System.out.println("server session created");
        super.sessionCreated(session);
    }

    @Override
    public void sessionOpened(IoSession session) throws Exception {
        System.out.println("server session Opened");
        super.sessionOpened(session);
    }

    @Override
    public void sessionClosed(IoSession session) throws Exception {
        System.out.println("server session Closed");
        super.sessionClosed(session);
    }
    
}

②、client端

import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.service.IoConnector;
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.NioSocketConnector;

public class MinaClient {

	public static void main(String[] args) {
		//1、创建客户端IoService
		IoConnector connector=new NioSocketConnector();  
		//客户端链接超时时间
		connector.setConnectTimeoutMillis(30000);  
		//2、客户端过滤器
		connector.getFilterChain().addLast("test",  
		new ProtocolCodecFilter(  
			new TextLineCodecFactory(  
				Charset.forName("UTF-8"),  
				LineDelimiter.WINDOWS.getValue(),  
				LineDelimiter.WINDOWS.getValue()  
				)  
			)  
		);  
		//3、客户端IoHandler,发生消息
		connector.setHandler(new MinaClientHandler("你好!/r/n 大家好!\\rquit")); 
		//连接服务端
		connector.connect(new InetSocketAddress("localhost", 9123)); 
		
	}
}
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

public class MinaClientHandler extends IoHandlerAdapter {

	private final String values;  
	
	public MinaClientHandler(String values) {  
		this.values = values;  
	}  
	
	@Override  
	public void sessionOpened(IoSession session) {  
		session.write(values);  
	} 
    
}

说明:其中MinaServer和MinaClient相当于服务端和客户端的入口,用于配置一些参数信息;两个Handler是真正收发,处理数据的地方

2、使用dispose关闭client

注意:调用session.close()之后,只是关闭当前的tcp连接,server端和client端还能正常运行,需要调用IoService的dispose方法才能关闭server端和client端

以client端为例子,在上面代码的基础上修改MinaClientHandler中的方法

@Override  
public void sessionOpened(IoSession session) {  
    session.write(values);  
    //调用IoService的dispose方法关闭线程
    IoService service = session.getService();
    service.dispose();
} 

这样每次调用client方法发送数据之后就会关闭client

3、接收服务端的反馈消息

①、在client的handler类中实现messageReceived方法

@Override
public void messageReceived(IoSession session, Object message) throws Exception {
    System.out.println("收到服务器响应消息:" + message);
}

②、修改server中的handler方法

@Override
public void messageReceived(IoSession session, Object message) throws Exception {
    //业务代码在这里编写处理
    String str = message.toString();
    System.out.println("The message received is [" + str + "]");
    //获取客户端的连接地址
    SocketAddress socketAddress = session.getRemoteAddress();
    System.out.println(socketAddress);
    //响应给对应客户端信息
    session.write("消息已处理,你可以去玩了。。。");

    if (str.endsWith("quit")) {
        //注意:在这里调用close方法之后,只是关闭当前的tcp连接,server端还正常运行,
        //需要调用IoService的dispose方法才能关闭server端,client端同理
        session.closeNow();
        return;
    }
}

@Override
public void messageSent(IoSession session, Object message) throws Exception {
    // TODO Auto-generated method stub
    System.out.println("发送数据成功了。。。"+message);
    //    	session.write("testSent");
    super.messageSent(session, message);
}

特别注意:在IoHandlerAdapter中有一个messageSent的方法,但是重写这个方法之后,不会发送数据,该方法只有数据发送成功之后才会调用,所以在 messageReceived 方法中使用 session.write("消息已处理,你可以去玩了。。。"); 给客户端响应数据

4、添加日志

mina内部使用的是slf4j日志,加入日志之后可以查看mina的运行细节信息 。在MinaServer中加入以下配置

//创建日志过滤器
LoggingFilter log = new LoggingFilter();
log.setSessionOpenedLogLevel(LogLevel.INFO);

//2、实现过滤器
acceptor.getFilterChain().addLast("logger", log);

5、整合springboot

maven引入jar包

<dependency>
    <groupId>org.apache.mina</groupId>
    <artifactId>mina-integration-spring</artifactId>
    <version>1.1.7</version>
</dependency>

创建一个配置类 ,参照MinaServer类,把mina相关组件注入到spring中

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
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.filter.executor.ExecutorFilter;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.study.testSpringBoot.mina.MinaServerHandler;

@Configuration
public class ConfigMina {

	/**
	 * 配置mina的多线程过滤器
	 * @return
	 */
	@Bean
	public ExecutorFilter executorFilter() {
		//设置初始化线程数,最大线程数
		ExecutorFilter executorFilter = new ExecutorFilter(10,20);
		return executorFilter;
	}
	
	/**
	 * 配置mina的转码过滤器
	 * @return
	 */
	@Bean
	public ProtocolCodecFilter protocolCodecFilter() {
		TextLineCodecFactory factory = new TextLineCodecFactory(Charset.forName("UTF-8"), 
				LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue());
		ProtocolCodecFilter pcf = new ProtocolCodecFilter(factory);
		return pcf;
	}
	
	/**
	 * 配置mina的日志过滤器
	 * @return
	 */
	@Bean
	public LoggingFilter loggingFilter() {
		return new LoggingFilter();
	}
	
	/**
	 * 将过滤器注入到mina的链式管理器中
	 * @return
	 */
	@Bean
	public DefaultIoFilterChainBuilder defaultIoFilterChainBuilder() {
		DefaultIoFilterChainBuilder def = new DefaultIoFilterChainBuilder();
		def.addLast("executor", executorFilter());
		def.addLast("logger", loggingFilter());
		def.addLast("protocol", protocolCodecFilter());
		return def;
	}
	
	/**
	 * 开启mina的server服务,并设置对应的参数
	 * @return
	 * @throws IOException
	 */
	@Bean
	public IoAcceptor ioAcceptor() throws IOException {
		IoAcceptor nio = new NioSocketAcceptor();
		//设置缓冲区大小
		nio.getSessionConfig().setReadBufferSize(2048);  
		//设置空闲状态时间,10秒没操作就进入空闲状态
		nio.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);  
		nio.setFilterChainBuilder(defaultIoFilterChainBuilder());
		nio.setHandler(new MinaServerHandler());
		nio.bind(new InetSocketAddress(9123));
		return nio;
	}
}

启动springboot项目,运行上面的client测试,发送接收成功

参考:https://blog.csdn.net/ljx8928358/article/details/7759024

写的很详细,可以参考

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!