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
写的很详细,可以参考
来源:CSDN
作者:plmzaqokn11
链接:https://blog.csdn.net/plmzaqokn11/article/details/103963281