본문 바로가기
dev/java

Writing the MINA time server

by igooo 2007. 4. 17.
728x90

MINA를 사용하여 타임 서버를 구현해보겠다.원문은 이곳을 참조 : http://mina.apache.org/quick-start-guide.html

Introduction

This tutorial will walk you through the process of building a MINA based program.  This tutorial will walk through building a time server.  The following prerequisites are required for this tutorial:

  • MINA 1.1 Core
  • JDK 1.5 or greater
  • SLF4J 1.3.0 or greater
    • Log4J 1.2 users: slf4j-api.jar, slf4j-log4j12.jar, and Log4J 1.2.x
    • Log4J 1.3 users: slf4j-api.jar, slf4j-log4j13.jar, and Log4J 1.3.x
    • java.util.logging users: slf4j-api.jar and slf4j-jdk14.jar
    • IMPORTANT: Please make sure you are using the right slf4j-*.jar that matches to your logging framework. For instance, slf4j-log4j12.jar and log4j-1.3.x.jar can not be used together, and will malfunction.

Writing the MINA time server

MinaTimeServer.java 파일을 만들어 준다.

public class MinaTimeServer{
   public static void main(String [] args){
   }
}

서버를 만들기위해 필요한것들을 하나씩 추가해보겠다.
일단 접속을 기다릴 객체를 추가하겠다. TCP/IP 기반인 프로그램임으로 SocketAcceptor를 추가하겠다.

import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.common.SimpleByteBufferAllocator;
import org.apache.mina.transport.socket.nio.SocketAcceptor;

public class MinaTimeServer{
   public static void main(String [] args){
      ByteBuffer.setUseDirectBuffers(false);
      ByteBuffer.setAllocator(new SimpleByteBufferAllocator());
      
      IoAcceptor acceptor = new SocketAcceptor();
   }
}

계속해서 handle class를 추가하 SocketAcceptor 클래스에 포트를 할당할 것이다. 만약 SocketAcceptor에 쓰레드 모델을 추가하고 싶으면 이곳을 참조하세요.(쓰레드 모델은 조만간 포스팅하겠습니다.)

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.common.SimpleByteBufferAllocator;
import org.apache.mina.filter.LoggingFilter;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.SocketAcceptor;
import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;

public class MinaTimeServer{
   private static final int PORT = 9123;
   
   public static void main(String [] args) throws IOException{
      ByteBuffer.setUseDirectBuffers(false);
      ByteBuffer.setAllocator(new SimpleByteBufferAllocator());
     
      IoAcceptor acceptor = new SocketAcceptor();
      
      SocketAcceptorConfig cfg = new SocketAcceptorConfig();
      cfg.setReuseAddress(true);
      cfg.getFilterChain().addLast("logger", new LoggingFilter());
      cfg.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
      
      acceptor.bind(new InetSocketAddress(PORT), new TimeServerHandler(), cfg);
      System.out.println("Mina Time Server started..");
   }
}

SocketAcceptor.bind() 메소드는 첫번째 값으로 IP주소와 port번호가 지정된 SocketAddress를 필요로 한다.
두번째 값은 IoHandler 인터페이스를 구현한 클래스여야 한다. 이번 예제에서는 IoHandlerAdapter를 구현하겠다.
세번째 값은 Configuration Object다. 위에서 cfg는 logger, codec 필터를 설정하였다. logger 필터는 간단한 로그필터다. 그리고 codec 필터는 TextLineCodexFactory를 이용하여 디코딩한다.


아래 클래스가 TimeServerHander다.

import java.util.Date;

import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.common.TransportType;
import org.apache.mina.transport.socket.nio.SocketSessionConfig;


public class TimeServerHandler extends IoHandlerAdapter{
   @Override
   public void exceptionCaught(IoSession session, Throwable t) throws Exception {
       t.printStackTrace();
       session.close();
   }

   @Override
   public void messageReceived(IoSession session, Object msg) throws Exception {
       String str = msg.toString();
       if(str.trim().equalsIgnoreCase("quit"))
           session.close();
       
       Date date = new Date();
       session.write(date.toString());
       System.out.println("Message written...");
   }

   @Override
   public void sessionCreated(IoSession session) throws Exception {
       System.out.println("Session created..");
       
       if(session.getTransportType() == TransportType.SOCKET)
           ((SocketSessionConfig)session.getConfig()).setReceiveBufferSize(2048);
       
       session.setIdleTime( IdleStatus.BOTH_IDLE, 10);
   }    
}

위에서 TimeServerHandler 클래스는 IoHandlerAdaptor 인터페이스에 3개의 메소드를 구현했다.
exceptionCaught 메소드는 간단하게 에러에 stack trace를 출력하고 연결을 닫는다.
messageReceived 메소드는 클라이언트에게 메시지를 받고 현재 시간을 출력한다.



Try out the Time server
Client Output
Server Output
user@myhost:~> telnet 127.0.0.1 9123
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hello
Mon Apr 09 23:42:55 EDT 2007
quit
Connection closed by foreign host.
user@myhost:~>







MINA Time server started.
Session created...
Message written...

MINA 사이트를 들어가보면 자주 업데이트가 이루어진다.

'dev > java' 카테고리의 다른 글

Java Virtual Threads 사용 시 synchronized 주의  (0) 2024.06.04
Virtual Threads  (0) 2024.06.02
java rsa 기반의 암호화  (0) 2016.01.04
자바 메모리 구조  (0) 2010.08.26
MINA Q&A  (0) 2007.04.15