카테고리:

4 분 소요

Apache MINA

자바(Java)를 이용해서 서버를 구축하는 방법에는 여러가지가 있겠지만, 아파치 미나(Apache MINA)의 구현 방법인 Nio Socket과 스레드(Thread)를 이용하여 비동기-스레드(Asynchronous-Thread)방식의 서버를 구현할 수 있다.

https://mina.apache.org/downloads-mina_2_1.html

다운로드 가능한 공식 주소는 위와 같다.

위의 주소에서 .zip을 다운받아 apache-mina-버전명-bin.zip을 압축을 풀게 되면

apache-mina-버전명-bin.zip을 압축을 푼 화면

dist폴더에 위와 같은 파일들이 나타는데, 우리가 필요한 내용은 mina-core-버전명.jar이다.

lib폴더에서 slf4j-api-버전명.jar을 확인한 화면

또한, 위의 lib폴더에서 slf4j-api-버전명.jar또한 복사하여 자신이 사용하는 IDE에 라이브러리로 추가 하면 준비가 완료된다.

문제 해결

만약 아래와 같은 오류가 발생한다면 다음 게시글을 따라 오류를 해결할 수 있다.

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

https://syudal.github.io/post/Java-SLF4J-orgslf4jimplStaticLoggerBinder-에러-해결하기/

소스 코드

아래의 예제는 Echo Server로 말 그대로 Echo(메아리)치듯이 전송한 데이터를 그대로 반송하는 서버이다.

  • MainServer.Java
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/*
 * @author syudal.tistory.com
 */
 
public class MainServer {
    public static void main( String[] args ) throws IOException
    {
        IoAcceptor acceptor = new NioSocketAcceptor();
        //acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
        acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
        acceptor.setHandler( new MainServerHandler() );
        acceptor.getSessionConfig().setReadBufferSize( 2048 );
        acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
        acceptor.bind( new InetSocketAddress( 포트주소 ) );
    }
}
  • MainServerHandler.java
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

/*
 * @author syudal.tistory.com
 */

public class MainServerHandler extends IoHandlerAdapter{ 
    
    @Override
    public void exceptionCaught( IoSession session, Throwable cause ) throws Exception
    {//오류가 있을 경우
        cause.printStackTrace();
    }

    @Override
    public void messageReceived( IoSession session, Object message ) throws Exception
    {//메시지를 받았을 경우
        session.write( message.toString() );//message로 받은 데이터를 string형으로 변경하여 세션으로 전송한다.
    }
    
    @Override
    public void sessionCreated( IoSession session) throws Exception
    {//세션이 생겼을 경우 = 클라이언트와 연결되었을 경우
        System.out.println("[Client] Connect " + session.getRemoteAddress());
    }
    @Override
    public void sessionClosed( IoSession session) throws Exception
    {//세션이 닫혔을 경우 = 클라이언트와 연결이 끊겼을 경우
        System.out.println("[Client] Disconnect " + session.getRemoteAddress());
    }
    
    @Override
    public void sessionIdle( IoSession session, IdleStatus status ) throws Exception
    {//세션이 유휴 상태에 있을 경우
        System.out.println( "IDLE " + session.getIdleCount( status ));
    }
}

참고

http://theeye.pe.kr/archives/710

태그: apache, Asynchronous-Thread, core, Echo, example, MINA, Nio, Server, SLF4J, Thread, 예제

업데이트: