jar包依赖:
另外还需要一个log4j.properties配置文件
server类:
自定义handler重新messageReceived方法:
<dependency>
<groupId>org.apache.mina</groupId>
<artifactId>mina-core</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>
</dependency>
另外还需要一个log4j.properties配置文件
server类:
IoAcceptor accepter = new NioSocketAcceptor();
ProtocolCodecFilter coderFilter = new ProtocolCodecFilter(
new TextLineCodecFactory(Charset. forName("UTF-8")));
/*
* 添加filter
* filter在DefaultIoFilterChainBuilder中是以list存储的
* private final List<Entry> entries;这里的Entry是DefaultFilterChain里
* 自定义的Entry: private class EntryImpl implements Entry{...}
* 可以调用addFirst,addLast,addAfter,addBefore方法进行添加filter,不同的方法
* 添加filter位置不同,执行的顺序不同,FilterChain按方法计算index将filter有序存储
* 所有添加的filter 要保证名字唯一
*/
accepter.getFilterChain().addLast("a", new LoggingFilter());
accepter.getFilterChain().addLast("b",coderFilter);
/*
* 设置消息处理类,必须,否则抛异常
* 继承IoHandlerAdapter类即可,重写messageReceived方法
* 对client消息进行处理
*/
accepter.setHandler(new MyServerHandler());
//设置session参数
accepter.getSessionConfig().setReadBufferSize(1024);
accepter.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
/*
* 绑定到某个socket端口,具体绑定是开启一个nio socket channel
* 启动调用顺序
* accepter的bind方法调用bindInternal方法,
* bindInternal调用startupAcceptor方法
* startupAcceptor方法中会启动一个线程对chanel进行select监听,
* org.apache.mina.core.polling.AbstractPollingIoAcceptor.Acceptor 线程监听类
*
* org.apache.mina.transport.socket.nio.NioSocketAcceptor
* .open(SocketAddress localAddress)方法源码
*
*protected ServerSocketChannel open(SocketAddress localAddress) throws Exception {
ServerSocketChannel channel = ServerSocketChannel.open();
boolean success = false;
try {
channel.configureBlocking(false);
ServerSocket socket = channel.socket();
socket.setReuseAddress(isReuseAddress());
socket.bind(localAddress, getBacklog());
channel.register(selector, SelectionKey.OP_ACCEPT);
success = true;
} finally {
if (!success) {
close(channel);
}
}
*/
accepter.bind(new InetSocketAddress(8484));
/*
* 启动后可telnet本机该端口进行测试
* >telnet 127.0.0.1 8484
* 连接后随便输入东西进行测试,信心怎么处理就看上面自定义的handler
*/
自定义handler重新messageReceived方法:
@Override
public void messageReceived( IoSession session, Object message ) throws Exception
{
String str = message.toString();
System.out.println(str);
if( str.trim().equalsIgnoreCase("quit") ) {
session.close(true);
return;
}
Date date = new Date();
session.write( date.toString() );
}