您的位置:首页 > 理论基础 > 计算机网络

Mina简介

2014-03-29 10:54 399 查看
Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。

Apache Mina也称为:

    1.NIO框架

    2.客户端/服务端框架(典型的C/S架构)

    3.网络套接字(networking socket)类库

    4.事件驱动的异步API(注意:在JDK7中也新增了异步API)

总之:我们简单理解它是一个封装底层IO操作,提供高级操作API的通讯框架!

 

Mina 的核心包:

org.apache.mina.core.service

    org.apache.mina.core.session

    org.apache.mina.core.polling

    org.apache.mina.transport.socket

 

    先用Mina做一个简单的应用程序。

第一步 下载使用的jar包

第二步 工程创建配置

DemoServer1

package lcl.mina.demo1;

import java.net.InetSocketAddress;

import java.nio.charset.Charset;

import org.apache.log4j.Logger;

import org.apache.mina.common.IdleStatus;

import org.apache.mina.common.IoAcceptor;

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;

import lcl.mina.demo1.DemoServer1Handler;

public class DemoServer1 {

private static Logger logger = Logger.getLogger(DemoServer1.class);

private static int PORT = 3005;

public static void main(String[] args) {
// TODO Auto-generated method stub

IoAcceptor acceptor = null;   // 创建连接

try{
//创建非组赛的server段的socket
acceptor = new NioSocketAcceptor();

//创建过滤器 (使用Mina提供的文本换行符编解码器)
acceptor.getFilterChain().addLast("codec",
new ProtocolCodecFilter(
new TextLineCodecFactory(
Charset.forName("utf-8"),
LineDelimiter.MAC.getValue(),
LineDelimiter.MAC.getValue()
)
)
);

//自己定义的编解码器

// acceptor.getFilterChain().addLast("codec",

// new ProtocolCodecFilter(

// new LCLTextLineCodecFactory(

// Charset.forName("utf-8"),

// "\r\n"

// )

// )

// );

//设置读取数据的缓冲区大小
acceptor.getSessionConfig().setReadBufferSize(2048);

//设置读写通道10庙内误操作进入空闲状态
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);

//绑定逻辑处理器
acceptor.setHandler(new DemoServer1Handler());

//绑定端口,启动服务
acceptor.bind(new InetSocketAddress(PORT));

logger.info("lcl server start uccess with port: " + PORT);

}catch(Exception e){

logger.error("lcl server start error",e);

e.printStackTrace();
}
}

}

DemoServer1Handler

package lcl.mina.demo1;

import java.util.Date;

import org.apache.log4j.Logger;

import org.apache.mina.common.IdleStatus;

import org.apache.mina.common.IoHandlerAdapter;

import org.apache.mina.common.IoSession;

public class DemoServer1Handler extends IoHandlerAdapter{

public static Logger logger = Logger.getLogger(DemoServer1Handler.class);

@Override
public void sessionCreated(IoSession session) throws Exception {
logger.info("server and client begin to create connect...");
}

@Override
public void sessionOpened(IoSession session) throws Exception {
logger.info("server and client has connect...");
}

@Override
public void messageReceived(IoSession session, Object message)
throws Exception {

String msg = message.toString();

logger.info("server receive data:" + msg);

if ("lcl".equals(msg)) { // 服务端断开连接的条件
session.close();
}

Date date = new Date();
session.write(date);
}

@Override
public void messageSent(IoSession session, Object message) throws Exception {
logger.info("server send message success...");
}

@Override
public void sessionClosed(IoSession session) throws Exception {

logger.info("session close");

}

@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
logger.info("server is not busy...");
}

@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
logger.info("server catch exception...");
}

}

LCLMinaClient1

package lcl.mina.demo1;

import java.net.InetSocketAddress;

import java.nio.charset.Charset;

import org.apache.log4j.Logger;

import org.apache.mina.common.ConnectFuture;

import org.apache.mina.common.IoConnector;

import org.apache.mina.common.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;

import lcl.mina.demo1.LCLMinaClient1Handler;

public class LCLMinaClient1 {

private static Logger logger = Logger.getLogger(LCLMinaClient1.class);

private static String HOST = "127.0.0.1";

private static int PORT = 3005;

public static void main(String[] args) {
// TODO Auto-generated method stub

// 创建一个非阻塞的客户端程序
IoConnector connector = new NioSocketConnector();  // 创建连接

// 设置链接超时时间
connector.setConnectTimeout(30000);

// 添加过滤器
connector.getFilterChain().addLast(   //添加消息过滤器
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("utf-8"), LineDelimiter.MAC.getValue(),
LineDelimiter.MAC.getValue())));

// 添加业务逻辑处理器类
connector.setHandler(new LCLMinaClient1Handler());// 添加业务处理

IoSession session = null;

try {

ConnectFuture future = connector.connect(new InetSocketAddress(
HOST, PORT));// 创建连接

future.awaitUninterruptibly();// 等待连接创建完成

session = future.getSession();// 获得session

session.write("lcl hello mina");// 发送消息

} catch (Exception e) {
logger.error("client connect catch exception...", e);
}

session.getCloseFuture().awaitUninterruptibly();// 等待连接断开
connector.dispose();

}

}

LCLMinaClient1Handler

package lcl.mina.demo1;

import org.apache.log4j.Logger;

import org.apache.mina.common.IoHandlerAdapter;

import org.apache.mina.common.IoSession;

public class LCLMinaClient1Handler extends IoHandlerAdapter {

private static Logger logger = Logger.getLogger(LCLMinaClient1Handler.class);

@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String msg = message.toString();

logger.info("client receive data:" + msg);

}

@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {

logger.error("client connect catch exception...", cause);

}

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