Mina简介

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);

}


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值