-
Apache MINA를 이용한 Echo서버 구현하기프로그래밍/Java 2019. 4. 1. 23:53728x90
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.tistory.com/entry/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
728x90댓글