最近在学习MINA框架,所以整理了下
注:MINA框架中的主要类
NioSocketAcceptor用于创建服务端监听;NioSocketConnector用于创建客户端连接;
IoSession用来保存会话属性和发送消息;
IoHandlerAdapter用于定义业务逻辑,常用的方法有:
sessionCreated() 当会话创建时被触发;
sessionOpened() 当会话开始时被触发;
sessionClosed() 当会话关闭时被触发;
sessionIdle() 当会话空闲时被触发;
exceptionCaught() 当接口中其他方法抛出异常未被捕获时触发此方法;
messageReceived() 当接收到消息后被触发;
messageSent() 当发送消息后被触发;
使用的架包分别是:mina-core-2.0.9.jar 、 slf4j-simple-1.7.12.jar、slf4j-api-1.7.12.jar
创一个连接服务器的类 CreateMinaServer
package mina.demo;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
//传输数据类
public class CreateMinaServer extends IoHandlerAdapter {
private int count = 0; //记录客户端的连接次数
//当一个新客户端连接时触发该方法
public void sessionCreated(IoSession ioSession){
System.out.println("\n新客服端连接了");
}
//当一个客户端连接时
public void sessionOpened(IoSession ioSession) throws Exception{
count ++;
System.out.println("\n第"+ count +"个客户端登录!address:"+ ioSession.getRemoteAddress());
}
//当客户端发送的消息到达时
public void meassageReceived(IoSession session, Object message){
User user = (User)message;
System.out.println("\n"+user.getName());
user.setName("张无忌");
session.write(user);
}
//当信息传达到客户端时触发该方法
public void messageSent(IoSession session,Object message){
System.out.println("\n信息已传送到客户端。");
}
//当客户端关闭时
public void sessionClosed(IoSession session){
System.out.println("\n客户端已关闭。");
}
// 当连接空闲时触发此方法
public void sessionIdle(IoSession session,IdleStatus status){
System.out.println("连接空闲。");
}
// 当接口中其他方法抛出异常未被捕获时触发此方法
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
System.out.println("其他方法抛出异常。");
}
}
测试类 TestMina
package mina.demo.test;
import java.io.IOException;
import java.net.InetSocketAddress;
import mina.demo.CreateMinaServer;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class TestMina {
/**
* @param args
*/
public static void main(String[] args) {
//创建一个非阻塞的服务器端(Server)的槽(Socket),用NIO
SocketAcceptor acceptor = new NioSocketAcceptor();
//创建接受数据的过滤器
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//设定过滤器一行行(/r/n)的读取数据
chain.addLast("mychin", new ProtocolCodecFilter(new TextLineCodecFactory() ));
//假设这个过滤器将以对象的单位读取数据
ProtocolCodecFilter filter = new ProtocolCodecFilter (new ObjectSerializationCodecFactory());
chain.addLast("objectFilter", filter);
//设定服务器消息处理器
acceptor.setHandler(new CreateMinaServer());
//绑定服务器的端口
int port = 1010;
/*
//绑定端口号,启动服务器
try {
acceptor.bind(new InetSocketAddress(port));
} catch (IOException e) {
System.out.println("启动服务器错误:" + port);
e.printStackTrace();
}
*/
//关闭服务器
acceptor.dispose(true);
if(acceptor.isDisposed()){
System.out.println("关闭服务器成功!");
}
//System.out.println("启动服务器成功:" + port);
}
}