Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。我们可以使用mina解决一些点对点通信的问题。
首先是引入项目所需要的依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dwl</groupId>
<artifactId>minaproject</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>org.apache.mina</groupId>
<artifactId>mina-core</artifactId>
<version>2.0.17</version>
</dependency>
</dependencies>
</project>
第二步服务端业务处理ServerHandler,这里继承自IoHandlerAdapter,重写其中的主要方法即可。
package com.mina;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
/**
* @program: minaproject
* @description: 服务端hander
* @author: daiwenlong
* @create: 2018-08-09 14:47
**/
public class ServerHandler extends IoHandlerAdapter{
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
System.out.println("=========server=======received:"+message);
//回复客户端
session.write("server return:"+message);
}
}
编写服务端
package com.mina;
import org.apache.mina.core.service.IoAcceptor;
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;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
/**
* @program: minaproject
* @description: 服务端
* @author: daiwenlong
* @create: 2018-08-09 14:58
**/
public class MInaServer {
public static void main(String[] args) throws Exception{
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast("codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
//设置处理器 就是业务逻辑处理的地方
acceptor.setHandler(new ServerHandler());
acceptor.bind(new InetSocketAddress(9764));
}
}
服务端写好了我们可以运行这个main方法,使用telnet访问被监听的端口。
在telnet窗口向服务端发送数据后会收到服务端的回复。
接下来我们继续写客户端的代码,首先是客户端的业务处理,跟服务端一样继承同一个类,重写其中几个主要的方法。
package com.mina;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
/**
* @program: minaproject
* @description: 客户端handler
* @author: daiwenlong
* @create: 2018-08-09 15:39
**/
public class ClientHandler extends IoHandlerAdapter {
@Override
public void messageSent(IoSession session, Object message) throws Exception {
super.messageSent(session, message);
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
System.out.println("========client========received:"+message);
}
}
最后是客户端代码。
package com.mina;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.session.IoSession;
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.NioSocketConnector;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
/**
* @program: minaproject
* @description: 客户端
* @author: daiwenlong
* @create: 2018-08-09 15:50
**/
public class Client {
public static void main(String[] args) {
NioSocketConnector connector = new NioSocketConnector();
connector.getFilterChain().addLast("logger", new LoggingFilter());
connector.getFilterChain().addLast("codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
//设置处理器 就是业务逻辑处理的地方
connector.setHandler(new ClientHandler());
ConnectFuture future = connector.connect(new InetSocketAddress("localhost",9764));
future.awaitUninterruptibly();
IoSession session = future.getSession();
session.getConfig().setUseReadOperation(true);
for(int i = 0;i<10;i++){
session.write("----------test---------"+i);
}
}
}
启动客户端后可以看到客户端向服务端连续发送了10条信息,服务端收到信息后回复客户端。
服务端:
客户端: