您的位置:首页 > 其它

Mina 2.0.9 详解-1-使用

2016-01-26 16:33 369 查看

简介

Mina是一个开源java语言编写的异步NIO通讯框架,很多公司的NIO框架产品都是依据Mina开发。了解之前,先介绍如何使用。使用Mina需要在服务端和客户端各自写代码。

服务端代码

创建非阻塞模式的套接字,初始化一些配置参数

指定接收数据后的过滤器,对接收数据做一些处理和过滤等

指定业务处理器,处理自己的核心业务逻辑

绑定端口,启动监听,等待客户连接

public class ZMinaServer {

private static final int PORT = 9257; // 定义监听端口

/**
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {

//创建一个非阻塞的Server端socket,用NIO
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getSessionConfig().setReadBufferSize(128);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
//创建接受数据的过滤器
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//设定这个过滤器将一行一行的读取数据
chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("utf-8"),
LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue())));// 指定编码过滤器
//log
LoggingFilter lf = new LoggingFilter();
lf.setSessionOpenedLogLevel(LogLevel.DEBUG);
acceptor.getFilterChain().addLast("logger", lf);

//myIo filter
acceptor.getFilterChain().addLast("myIofilter", new ReferenceCountingFilter(new MyIoFilter()));
// 指定业务逻辑处理器
acceptor.setHandler(new Handler());
// 设置端口号
acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));
acceptor.bind(); //启动监听
System.out.println("Mina Server is Listen ON:" + PORT);
}

}


上述代码中,有一个读数据的编码过滤器,有一个日志过滤器,还有一个自己实现的过滤器,代码如下:

public class MyIoFilter implements IoFilter {

public void destroy() throws Exception {
System.out.println("dstroy");
}

public void exceptionCaught(NextFilter nextFilter, IoSession session, Throwable cause) throws Exception {
System.out.println("exceptionCaught");
nextFilter.exceptionCaught(session, cause);
}

public void filterClose(NextFilter nextFilter, IoSession session) throws Exception {
System.out.println("filterClose");
nextFilter.filterClose(session);
}

public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
System.out.println("filterWrite");
nextFilter.filterWrite(session, writeRequest);
}

public void init() throws Exception {
System.out.println("init");
}

public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception {
System.out.println("messageReceived");
nextFilter.messageReceived(session, message);
}

public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
System.out.println("messageSent");
nextFilter.messageSent(session, writeRequest);
}

public void onPostAdd(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception {
System.out.println("onPostAdd");
}

public void onPostRemove(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception {
System.out.println("onPostRemove");
}

public void onPreAdd(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception {
System.out.println("onPreAdd");
}

public void onPreRemove(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception {
System.out.println("onPreRemove");
}

public void sessionClosed(NextFilter nextFilter, IoSession session) throws Exception {
System.out.println("sessionClosed");
nextFilter.sessionClosed(session);
}

public void sessionCreated(NextFilter nextFilter, IoSession session) throws Exception {
System.out.println("sessionCreated");
nextFilter.sessionCreated(session);
}

public void sessionIdle(NextFilter nextFilter, IoSession session, IdleStatus status) throws Exception {
System.out.println("sessionIdle");
nextFilter.sessionIdle(session, status);
}

public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception {
System.out.println("sessionOpened");
nextFilter.sessionOpened(session);
}

/**
* @see org.apache.mina.core.filterchain.IoFilter#inputClosed(org.apache.mina.core.filterchain.IoFilter.NextFilter, org.apache.mina.core.session.IoSession)
*/
public void inputClosed(NextFilter nextFilter, IoSession session) throws Exception {
}

}


核心业务逻辑是给客户返回当前时间,其实现如下:

public class Handler extends IoHandlerAdapter {
//当一个客户端连接进入时
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("incoming client:" + session.getRemoteAddress());
}

//当客户端发送消息到达时
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
String s = message.toString();
System.out.println("client send message is:" + s);
if ("quit".equals(s)) {
session.close();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd mm:hh:ss");
Date date = new Date();
session.write(sdf.format(date));// 返回当前时间的字符串

}

//当一个客户端连接关闭时
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("one client closed");
}
}


Client 代码

创建一个Connector

指定发送数据的过滤器

指定客户端的业务处理逻辑

指定监听器

public class ZMinaClient {

/**
*
* @param args
*/
public static void main(String[] args) {
IoConnector connector = new NioSocketConnector();
connector.setConnectTimeoutMillis(3000);
connector.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),
LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue())));
connector.setHandler(new ClientHandler());
ConnectFuture connectFuture = connector.connect(new InetSocketAddress("localhost", 9257));
//add listenner
connectFuture.addListener(new IoFutureListener<ConnectFuture>() {
public void operationComplete(ConnectFuture future) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
IoSession session = future.getSession();
System.out.println("sesson:" + session.getTransportMetadata().getName());
}

});
//test
System.out.println("########");

}
}


其业务逻辑处理是向sever端发送数据,代码如下:

public class ClientHandler extends IoHandlerAdapter {

private String values;

public ClientHandler() {

}

@Override
public void sessionOpened(IoSession session) {
this.values = "hello,zhoupj!";
System.out.println("send:" + values);
session.write(values);
}
//当Server消息到达时
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
String s = message.toString();
System.out.println("client receives:" + s);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  框架 Mina-nio