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,并注册到IoServiceacceptor.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 {@Overridepublic 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;}}@Overridepublic void sessionCreated(IoSession session) throws Exception {System.out.println("server session created");super.sessionCreated(session);}@Overridepublic void sessionOpened(IoSession session) throws Exception {System.out.println("server session Opened");super.sessionOpened(session);}@Overridepublic 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、创建客户端IoServiceIoConnector 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 stubSystem.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*/@Beanpublic ExecutorFilter executorFilter() {//设置初始化线程数,最大线程数ExecutorFilter executorFilter = new ExecutorFilter(10,20);return executorFilter;}/*** 配置mina的转码过滤器* @return*/@Beanpublic 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*/@Beanpublic LoggingFilter loggingFilter() {return new LoggingFilter();}/*** 将过滤器注入到mina的链式管理器中* @return*/@Beanpublic 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*/@Beanpublic 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

写的很详细,可以参考

springboot整合mina相关推荐

  1. Springboot整合Dubbo简单示例

    Springboot 整合dubbo: 1 简介 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的 ...

  2. 关于SpringBoot整合Netty客户端和服务端实现JT808协议

    关于SpringBoot整合Netty客户端和服务端实现JT808协议 最近做了一个使用netty实现交通部JT808协议的项目,对比了mina和netty两种框架的使用,先整理一下netty的实现过 ...

  3. SpringBoot第九篇: springboot整合Redis

    这篇文章主要介绍springboot整合redis,至于没有接触过redis的同学可以看下这篇文章:5分钟带你入门Redis. 引入依赖: 在pom文件中添加redis依赖: <dependen ...

  4. es springboot 不设置id_原创 | 一篇解决Springboot 整合 Elasticsearch

    ElasticSearch 结合业务的场景,在目前的商品体系需要构建搜索服务,主要是为了提供用户更丰富的检索场景以及高速,实时及性能稳定的搜索服务. ElasticSearch是一个基于Lucene的 ...

  5. springboot整合shiro使用shiro-spring-boot-web-starter

    此文章仅仅说明在springboot整合shiro时的一些坑,并不是教程 增加依赖 <!-- 集成shiro依赖 --> <dependency><groupId> ...

  6. db2 springboot 整合_springboot的yml配置文件通过db2的方式整合mysql的教程

    springboot整合MySQL很简单,多数据源就master,slave就行了,但是在整合DB2就需要另起一行,以下是同一个yml文件 先配置MySQL,代码如下 spring: datasour ...

  7. 九、springboot整合rabbitMQ

    springboot整合rabbitMQ 简介 rabbitMQ是部署最广泛的开源消息代理. rabbitMQ轻量级,易于在内部和云中部署. 它支持多种消息传递协议. RabbitMQ可以部署在分布式 ...

  8. 八、springboot整合Spring Security

    springboot整合Spring Security 简介 Spring Security是一个功能强大且可高度自定义的身份验证和访问控制框架.它是保护基于Spring的应用程序的事实标准. Spr ...

  9. 六、springboot整合swagger

    六.springboot整合swagger 简介 swagger 提供最强大,最易用的工具,以充分利用OpenAPI规范. 官网 : https://swagger.io/ 准备工作 pom.xml ...

最新文章

  1. class function或class procedure是什么意思
  2. 了解万用表历史,万用表的前世今生
  3. Python:colorlog的三个例子
  4. 史上最详细Docker搭建Redis Cluster集群环境 值得收藏 每步都有图,不用担心学不会
  5. 你还在问android横竖屏切换的生命周期?
  6. 深入理解Linux调度子系统
  7. mysql数据库备份方式,跳槽大厂必看!
  8. 【福利】MySQL vs Postgre SQL: 5个你最关注的非技术维度的区别
  9. 一条关于swap争用的报警邮件分析(一)
  10. CodeIgniter框架中的多语言
  11. 6-汇编语言中段的使用+dw+start标号
  12. 数据库的主键Id不是从1开始的
  13. 如何将pdf中的矢量图另存为图片
  14. 分享个强大的抓包工具
  15. android虚拟pdf打印机,pdf虚拟打印机(PDF-XChange Lite Printer)
  16. 计算机怎么更改性能模式,笔记本怎么开高性能模式 让电脑变流畅的方法详细介绍...
  17. 幸存者偏差——讨论死在中国游戏圈的一百万种方式
  18. JavaScript计时器制作进度条
  19. C++多态的好处和作用(游戏程序实例)
  20. Win7 更新 80072EFE 错误

热门文章

  1. burpsuite安装的问题
  2. 微信小程序——绑定点击事件
  3. pico的学习之路(三)——CTRT5000一路寻迹传感器|黑白传感器|红外传感器(树莓派pico实现)
  4. NXP S32K1 时钟系统
  5. 林大OJ习题 2020年1月5日
  6. 程序员只吃青春饭?大龄程序员都去哪了?
  7. 淘宝API接口如何调取产品数据?
  8. win11找不到本地组策略编辑器的解决方法
  9. 《痞子衡嵌入式半月刊》 第 58 期
  10. 【STM32H7教程】第78章 STM32H7的QSPI总线基础知识和HAL库API