`

mina 简单server端例子

    博客分类:
  • mina
阅读更多
jar包依赖:
	<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() );
    }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics