大家好,又见面了,我是你们的朋友全栈君。
一、mina简介
mina框架是对nio进行的一个封装,可用于java的网络编程,包括TCP/IP和UTP/IP编程,主要屏蔽了网络通信的一些细节,对socket进行封装,并且是用nio的一个实现框架,mina的主要类如下:
1、IoService接口
用于描述客户端和服务端的接口,子类有IoConnector(客户端)和IoAcceptor(服务端)。
1.1 IoConnector接口
该接口用于描述客户端,链接远程服务端,实现类是NioSocketConnector。
- NioSocketConnector
该类具体实现了链接远程网络的方法。
1.2 IoAcceptor接口
该接口定义了作为服务端 要干的事情,具体实现类是NioSocketAcceptor。
- NioSocketAcceptor
该类具体实现了监听远程发送过来的链接后的各种操作。
2、IoProceser
多线程环境来处理我们的链接请求流程。
3、IoFilter
提供数据的过滤工作,包括编码和解码、日志等信息的过滤。
4、Hanlder
处理具体的业务对象,默认的实现类有IoHanlderAcceptor,自定义的业务处理类,需要继承IoHanlderAcceptor类。
5、IoSession
描述客户端和服务端建立链接的会话,通过该会话,可接收和发送信息。
6、流程总结
客户端:IoConnector—>IoProcessor–>IoFilter—>Hanlder,
服务端:IoConnector—>IoProcessor–>IoFilter—>Hanlder。
二、简单的客户端和服务端实例
1、服务端
代码语言:javascript复制package mina.demo1;
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.service.IoHandlerAdapter;
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;
/**
* @author:zhangfd
* @version:1.0
* @date:2017年12月9日 下午10:32:41
* @description:
*/
public class MinaServer {
public static int port=3333;
private static IoAcceptor server = null;
public static void main(String[] args) throws IOException {
//1、创建服务器
server = new NioSocketAcceptor();
//2、设置编码过滤器
server.getFilterChain().addLast("codec",
new ProtocolCodecFilter(
new TextLineCodecFactory(
Charset.forName("utf-8"),
LineDelimiter.WINDOWS.getValue(),
LineDelimiter.WINDOWS.getValue())));
//3、设置一次读取数据的大小
server.getSessionConfig().setReadBufferSize(1024);
//4、设置网络闲置时间
server.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 1000);
//5、处理具体的业务信息
server.setHandler(new MyIoHandlerAdapterServer());
//6、绑定对本地端口的监听
server.bind(new InetSocketAddress(port));
}
}
总结:创建服务端步骤:
- 创建NioSocketAcceptor对象,
NioSocketAcceptor server = new NioSocketAcceptor();
2、设置编码、解码处理器链。
server.getFilterChain().addLast(处理器名, ProtocolCodecFilter对象)
(ProtocolCodecFilter对象的创建需要编码和解码器)
解码器类一般继承CumulativeProtocolDecoder
编码器类一般继承ProtocolEncoderAdapter
3、设置网络闲置时间
server.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 1000);
4、处理具体的业务信息
server.setHandler(new MyIoHandlerAdapterServer());
MyIoHandlerAdapterServer需要继承IoHandler类
5、绑定对本地端口的监听
server.bind(new InetSocketAddress(port));
2、客户端
代码语言:javascript复制package mina.demo2;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.session.IoSession;
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;
/**
* @author:zhangfd
* @version:1.0
* @date:2017年12月10日 下午2:06:44
* @description:
*/
public class MinaClinet {
static int port=3333;
static String ip="localhost";
private static IoConnector client = null ;
static IoSession ioSession = null;
public static void main(String[] args) {
//1、创建客户端对象
client = new NioSocketConnector();
//2、设置编码过滤器
client.getFilterChain().addLast("coderc",
new ProtocolCodecFilter(
new TextLineCodecFactory(
Charset.forName("utf-8"),
LineDelimiter.WINDOWS.getValue(),
LineDelimiter.WINDOWS.getValue())));
//3、处理具体的业务
client.setHandler(new MyIoHandlerAdapterClient());
//4、设置链接超时时间
client.setConnectTimeoutMillis(3000);
//5、链接远程网络
ConnectFuture conncetFuture = client.connect(new InetSocketAddress(ip, port));
//6、等到链接
conncetFuture = conncetFuture.awaitUninterruptibly();
//7、获取当前链接远程会话
ioSession = conncetFuture.getSession();
//8、客户端发出消息
ioSession.write("客户端发出消息:你好,服务端");
//9、等待关闭会话
ioSession.getCloseFuture().awaitUninterruptibly();
//10、关闭客户端
client.dispose();
}
}
代码语言:javascript复制package mina.demo2;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
/**
* @author:zhangfd
* @version:1.0
* @date:2017年12月9日 下午10:54:56
* @description:
*/
public class MyIoHandlerAdapterClient extends IoHandlerAdapter{
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("sessionCreated");
}
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("sessionOpened");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
// TODO Auto-generated method stub
super.sessionClosed(session);
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
System.out.println("sessionIdle");
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
//接收来自服务端的消息
String msg = (String) message;
System.out.println("接收到来自服务端的消息为:" msg);
//接收完后给客户端提供反馈消息
/*String s = "Thank you ,we had received your message";
session.write(s);*/
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
String msg = (String) message;
System.out.println("发送出去的信息为:" msg);
}
}
步骤:
1、创建NioSocketConnector对象
//创建客户端对象
NioSocketConnector client = new NioSocketConnector();
2、//设置编码过滤器
client.getFilterChain().addLast(处理器名, ProtocolCodecFilter对象)
(ProtocolCodecFilter对象的创建需要编码和解码器)
解码器类一般继承CumulativeProtocolDecoder
编码器类一般继承ProtocolEncoderAdapter
3、//处理具体的业务
client.setHandler(new MyIoHandlerAdapterClient());
4、//设置链接超时时间
client.setConnectTimeoutMillis(3000);
5、//链接远程网络
ConnectFuture conncetFuture = client.connect(new InetSocketAddress(ip, port));
6、//等到链接
conncetFuture = conncetFuture.awaitUninterruptibly();
7、//获取当前链接远程会话
IoSession ioSession = conncetFuture.getSession();
8、//客户端发出消息
ioSession.write(“客户端发出消息:你好,服务端“);
9、//等待关闭会话
ioSession.getCloseFuture().awaitUninterruptibly();
10、//关闭客户端
client.dispose();
三、实际项目上的使用
在真实的项目中,经常拿mina与spring结合一起使用。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125896.html原文链接:https://javaforall.cn