Apache MINA와 WebSocket으로 통신하기
카테고리: Java + Kotlin
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와 연동하는 방법은 다음과 같다.
- 위의 소스를 다운로드 받아 프로젝트 src의 적당한 위치에 압축을 해제하고 refactor한다.
- 연동되어 있는 MainHandler의 messageRecived 부분을 예제와 같이 수정한다.
- 이후 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( 포트주소 ) );
}
}