카테고리:

2 분 소요

Apache MINA의 구조

Apache MINA는 아래와 같은 구조를 띄고 있다.

Apache MINA의 구조

IoService와 IoHandler사이에 IoFliter들을 추가하여 원하는 스타일의 소켓 통신을 할 수 있다.

WebSocket같은 경우에도 HandShake과정과 같은 구현을 IoFliter를 추가함으로서 쉽게 해결할 수 있다.

하지만, 기본적인 Protocol들은 자체 Fliter로서 구현이 되어 있지만, WebSocket은 자체적으로 구현이 되어 있지 않다.

또한, https://tools.ietf.org/html/rfc6455에 모든 내용이 기록되어 있다.

https://github.com/syudal/Apache-Mina-IoFilter-WebSocket

Apache MINA와 연동하기

Apache Mina와 연동하는 방법은 다음과 같다.

  1. 위의 소스를 다운로드 받아 프로젝트 src의 적당한 위치에 압축을 해제하고 refactor한다.
  2. 연동되어 있는 MainHandler의 messageRecived 부분을 예제와 같이 수정한다.
  3. 이후 MainServer 구동부의 ioFilter를 수정하고 constant.java의 Protocol명을 수정하면 된다.
  • 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( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
        acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new WebSocketFactory()));

        acceptor.setHandler( new MainServerHandler() );
        acceptor.getSessionConfig().setReadBufferSize( 2048 );
        acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
        acceptor.bind( new InetSocketAddress( 포트주소 ) );
    }
}

태그: apache, IoBuffer, IoFilter, mina, Mina-core, protocol, ProtocolCodecFilter, rfc6455, websocket, ws://

업데이트: