Apache MINA를 이용한 Echo서버 구현하기
카테고리: Java + Kotlin
Apache MINA
자바(Java)를 이용해서 서버를 구축하는 방법에는 여러가지가 있겠지만, 아파치 미나(Apache MINA)의 구현 방법인 Nio Socket과 스레드(Thread)를 이용하여 비동기-스레드(Asynchronous-Thread)방식의 서버를 구현할 수 있다.
https://mina.apache.org/downloads-mina_2_1.html
다운로드 가능한 공식 주소는 위와 같다.
위의 주소에서 .zip을 다운받아 apache-mina-버전명-bin.zip을 압축을 풀게 되면
dist폴더에 위와 같은 파일들이 나타는데, 우리가 필요한 내용은 mina-core-버전명.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 ));
}
}