MINA 2.0 에코서버 만들기

개발 이야기/MINA | 2009. 5. 21. 11:17
Posted by 시반

이번에 소개하고자 하는것은 이희승씨가 커미터로 계셨다는 

MINA(A Multi-purpose Infrastructure for Network Applications)입니다.

간단하게 말하면 자바의 네트워크 애플리케이션을 위한 프레임워크입니다.
필터를 사용한 뛰어난 확장성과 프로토콜 코덱과 비즈니스 로직을 분리하여 유지보수와 재사용성을 높인것이 특징인데요.
한글레퍼런스나 튜토리얼을 기대했는데 역시 아파치 재단이랄까?

이희승씨를 믿고 있건만 영어의 압박이 저를 힘들게 하네요...-_- a.

하지만 사용법은 그다지 어렵지 않은 듯 보입니다.간단하게 예제 프로그램을 따라 만들어 보았습니다.

MINA v2.0 Quick Guild를 참고하였으며. 현재 버젼은 M5까지 나와있습니다 기존의 문제점을 개선한 MINA3을 준비중이라고 하네요.
일단 예제를 위해서는 MINA코어뿐만 아니라 SLF4J Log4J도 필요로 하고 있구요.
SLF4J의 경우에는 1.5.6 버젼까지 나와있는 상태인데 사용하는 Log4J버젼에 따라 선택하면 됩니다.

slf4j-api-1.5.6.jar파일과 slf4j-logj12-1.5.6.jar을 사용합니다. log4j가 1.2버젼이라서.....
기타 JDK6.0, Eclipse3.4 환경에서 테스트합니다.

 
MinaTimeServer

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;
 
public class MinaTimeServer
{
   
private static final int PORT = 9123;
 
   
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 TimeServerHandler());
 
        acceptor
.getSessionConfig().setReadBufferSize(2048);
        acceptor
.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
 
        acceptor
.bind(new InetSocketAddress(PORT));
   
}
}


Non-Blocking IO로 만듭니다. 클라이언트의 연결 및 실시간 요청을 처리할 리스너를 등록합니다.

IoAcceptor 인터페이스로 구현된 acceptor 객체에 하나이상의 필터들을 등록할 수 있는데 이것을 FilterChain이라 합니다.

이 필터체인이라는 것에 addLast를 통해 필터들을 등록합니다.

위와 같이 로깅을 하거나 인코딩 코덱을 만들어 사용할 수 있습니다.
핸들러를 추가하고 버퍼와 유휴시간을 정의한 후에 PORT를 설정하여 Bind합니다.

TimeServerHandler

import java.util.Date;
 
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
 
public class TimeServerHandler extends IoHandlerAdapter
{

   
@Override
   
public void exceptionCaught(IoSession session, Throwable cause)
       
throws Exception
   
{
        cause
.printStackTrace();
   
}

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

   
@Override
   
public void sessionIdle(IoSession session, IdleStatus status)
       
throws Exception
   
{
       
System.out.println("IDLE " + session.getIdleCount(status));
   
}
}


이녀석이 실제로 통신에 사용되는 핸들러입니다. 메시지를 받을때 마다 messageReceived이 호출됩니다.
쓰레드를 이용하고 있으며, 콜백형식으로 작동하는 것을 알 수 있습니다.

sessionIdle을 사용하면 Main에서 정의한 유휴시간마다 호출됩니다.

앞서 10초로 설정해 두었으니 10초동안 유휴상태로 있다면 그때마다 이 함수가 호출됩니다.

getIdleCount를 이용해 얼마나 유휴상태에 있는지를 확인하도록 합니다. 서버를 완성했으니 실행해 볼까요.

c:>telnet localhost 9123

 


quit를 입력하면 종료되고 그 이외의 문자를 입력하면 시간이 출력되는 것을 알 수 있습니다.

한글을 입력시 MalformedInputException이 나면서 동작안하는 경우가 있는데

인코딩타입을 UTF-8로 바꾸어주면됩니다.

번역한 튜토리얼은 첨부파일로 첨부합니다. 최대한 매끄러게 번역을 하려고 했는데. 앞서 이야기했지만 영어가 딸려놔서리..

오역이나 이상한 것들은 기냥 구박마시고 조용히 알려주세요..*^^*

 

'개발 이야기 > MINA' 카테고리의 다른 글

[MINA] Logging Configuration  (0) 2009.11.30
MINA에서 버퍼 제어하기 - IoBuffer  (0) 2009.06.01
MINA 기반의 어플리케이션 구조  (0) 2009.05.28
 

3. VoIP 기술② : 네트워크 구조

개발 이야기/VoIP | 2008. 9. 18. 13:25
Posted by 시반
호스티드 IP-PBX 이용한 VoIP 네트워크 시선집중
프로토콜별 VoIP 네트워크 구성 다양 … 새로운 서비스 모델 호스티드 IP-PBX 확산

 

6. VoIP 향후 전망


이종석
케이티인포텍 신사업기획단 상무
jslee@kti.co.kr

지난 호에서는 H.323과 SIP를 중심으로 VoIP 서비스에 사용되는 콜처리 프로토콜들과 콜처리 플로우에 대해 살펴봤다. PSTN은 음성통신 서비스에 특화된 네트워크기 때문에 프로토콜 구조가 간단하며, 효율적으로 구성돼 있다. 그러나 인터넷을 위시한 패킷 네트워크는 파일전송 및 기타 실시간 통신을 목적으로 한 네트워크가 아니어서, VoIP 시스템 등의 실시간 통신 시스템에는 여러 가지 특별한 프로토콜 및 기술들이 필요하다. 이번 호에서는 VoIP 기술에 대해 보다 상세히 알아본다. <편집자>

VoIP 네트워크는 엔드 투 엔드(end-to-end)의 사용자 단말까지의 서비스 유형과 구성 프로토콜에 따라 다양한 형태로 구성될 수 있다. 우선 H.323, SIP, MGCP, MEGACO 등 VoIP 프로토콜에 따른 네트워크의 구성형태를 간략히 설명하고, 그 구성 요소들에 대해 자세히 살펴보기로 한다.

1. 프로토콜별 VoIP 네트워크 구성
1) H.323 프로토콜 기반 네트워크 기본 구조

H.323 프로토콜을 사용한 VoIP 서비스를 위한 네트워크 구조는 패킷 기반의 네트워크상에 단말(Terminal), 게이트웨이(Gateway), 게이트키퍼(Gatekeeper), MCU (Multi-point Control Unit) 등의 네트워크 요소들이 연결된 형태로 구성돼 H.323 게이트웨이를 통해 PSTN과 같은 회선교환망과 연동하게 된다.
<그림 2>는 IP 네트워크상에 연결된 본사와 원격 지사간에 H.323 프로토콜을 이용하고 기존 PBX나 PSTN과의 상호연동은 시스코의 게이트키퍼/게이트웨이와 라우터의 혼합 기능을 가진 장비를 이용해 VoIP 서비스를 제공하는 네트워크 구성을 보여준다.


2) SIP 프로토콜 기반 네트워크 기본 구조
SIP 프로토콜은 지난 호에 설명한 것처럼 사용자 사이에 인터랙티브 멀티미디어 통신 세션들의 시작, 변경, 종료를 정의하는 애플리케이션 계층의 시그널링 프로토콜이다.

3) SIP 프로토콜 기반 네트워크 구성 요소
TCP 또는 UDP를 통해 전송되는 텍스트 기반 SIP 네트워크의 주요 구성 요소로는 유저 에이전트, 프록시 서버, 콜을 시작하고 수신하고 종료하는 애플리케이션인 유저 에이전트, 리다이렉트 서버, 그리고 레지스터 서버 등으로 구성된다.

4) MGCP 프로토콜 기반 네트워크 기본 구조
MGCP는 미디어 게이트웨이들의 제어를 구체적으로 어드레싱하는 제어 프로토콜로 미디어 게이트웨이 컨트롤러나 콜에이전트라고 불리는 외부 콜제어 요소들로부터 텔레포니 게이트웨이들을 제어하기 위한 프로토콜이다.
MGC와 MGC간에는 SIP나 H.323 프로토콜을 사용하며 MGC와MGCP간에는 MGCP프로토콜을 사용해 콜처리를 하는 구조로 돼 있다. 미디어 게이트웨이는 음성의 패킷화를 제공하고 미디어 게이트웨이 컨트롤러는 콜제어 로직을 제공하며 미디어 게이트웨이간은 RTP/RTCP 프로토콜을 사용해 미디어 데이터를 주고 받게 된다.
MGCP 프로토콜을 사용한 콜처리 과정을 간단히 나타내면 다음과 같다.


1. 사용자 A가 전화기를 들면 게이트웨이 A는 콜 에이전트에게 시그널을 보낸다.
2. 게이트웨이 A는 다이얼톤을 발생하고 다이얼된 디지트들을 수집한다.
3. 디지트들은 콜 에이전트에게 전달된다.
4. 콜 에이전트는 콜을 어떻게 라우팅할 지를 결정한다.
5. 콜 에이전트는 게이트웨이 B에게 명령어를 전송한다.
6. 게이트웨이 B는 사용자 B에게 링을 울린다.
7. 콜 에이전트는 RTP/RTCP 세션을 설정하기 위한 양쪽 게이트웨이에 명령어를 보낸다.
 
5) VoIP 서비스용 차세대 네트워크 기본 구조
<그림 6>은 차세대 네트워크상의 VoIP 서비스를 위한 네트워크 구조다. 소프트스위치는 호 처리를 위한 MEGACO, SIP, SIGTRAN 등의 다양한 시그널링 프로토콜들을 지원해 SIP 등록 및 위치 트래킹과 같은 서비스를 포함한 VoIP 네트워크상의 콜 라우팅 서비스를 제공하는 역할을 하고, 다른 도메인간의 소프트스위치간에는 BICC 혹은 SIP-T 프로토콜을 사용해 접속된다.
PSTN과의 연동은 NO.7 신호망과의 연동을 위해 시그널링 게이트웨이를 이용하고, 트렁크 게이트웨이를 위해 베어러(Bearer) 데이터를 전송하게 된다. 기업 내의 레거시 회선기반 PBX와의 연동을 위해 액세스 게이트웨이를 사용해 구축될 수도 있다.


2. 호스티드 IP-PBX 네트워크 구조
1) IP-PBX 개요

IP-PBX는 크게 장비가 설치되는 위치에 따라 각 기업체 내에 설치돼 자체 관리 요원에 의해서 개별적으로 관리되는 매니지드 IP-PBX와 서비스 사용자에게는 단말기만 제공 또는 구입하도록 하고 서비스 제공자는 자신의 데이터센터에 대용량의 호 처리가 가능한 IP-PBX를 설치해 모든 서비스의 제공 및 기기의 관리 등이 서비스 제공자에 의해 관리되는 호스티드 IP-PBX로 구분된다.
한편 호스티드 IP-PBX는 각 솔루션 업체마다 조심씩 다르지만 기존의 TDM 센트렉스(Centrex) 정도의 서비스 기능만을 가질 때는 IP 센트렉스, 그리고 여기에 IP 망 특유의 웹과 연동해 모바일/리모트 서비스나 프레즌스(presence) 서비스와 같은 이동성 기능 또는 화상 컨퍼런스 서비스와 같은 IP 서비스가 추가될 때에는 호스티드 IP-PBX로 구분해 사용하기도 한다. 특히 호스티드 IP-PBX는 캐리어급 플랫폼(Carrier-grade platform), 멀티 로케이션(Multi-location) 및 멀티-테넌트(multi-tenant), 풍부한 네트워킹 기능들, 그리고 데이터센터에 집중화된 구성의 특징을 갖는 새로운 개념의 서비스 모델이다.
기간통신 서비스 제공업체들로 하여금 다양한 SME나 소호 계층을 위해 IP-PBX 서비스를 제공할 수 있게 하는 호스티드 IP-PBX의 네트워크 구조에 대해 살펴보기로 하자.

2) 美 실란트로 IP-PBX 네트워크 구조
<그림 7>은 미국 실란트로(Sylantro)의 IP 기반 호스티드 IP-PBX의 네트워크 구성도다. 주요 구성 요소에는 콜 처리를 위한 애플리케이션 피처 서버 및 라우팅 관리 서버와 미디어/메시징 처리를 위한 IP UMS 서버 및 미디어 서버들과 망 요소 관리를 위한 EMS 서버들로 구성돼 있다.
레거시 시스템들과의 연동을 위해 소프트스위치를 통한 SIGTRAN 프로토콜을 사용해 시그널링 게이트웨이와 연동하거나 미디어 게이트웨이에 PSTN에 PRI 방식으로 연결되는 두 가지 방식을 제공한다. H.323와 MEGACO 프로토콜은 지원하지 않고 현재 콜 처리를 위해 SIP와 MGCP의 두 가지 방식만을 지원한다.


3) 브로드소프트 IP-PBX 네트워크 구조
브로드소프트(Broadsoft)의 IP-PBX도 실란트로의 시스템처럼 IP 네트워크상의 SIP 기반 시스템이다. 네트워크의 구조상에는 차이가 없고 구성 솔루션의 플랫폼과 부가 서비스 부분이 다를 뿐이다. IAD(integrated Access Device)를 통해 KTS(Key Telephone System)나 PBX(Private Bran ch eXchange) 등을 포함한 레거시 시스템들과 아날로그 전화에도 서비스가 가능하다.
<그림 9>는 소프트스위치 기반의 IP-PBX 네트워크의 구조다. 미디어 게이트웨이를 통해 PSTN망과 연동하면서 미디어 트랜스포트를 수행하고, 소프트스위치는 SIGTRAN 프로토콜을 사용해 PSTN의 신호망과 연동한다. 기업 구내망과 캐리어 사업자의 네트워크는 기본적인 콜 처리를 위해 마찬가지로 SIP를 사용한다.

'개발 이야기 > VoIP' 카테고리의 다른 글

6. VoIP 향후 전망  (0) 2008.09.18
5. VoIP 시장 동향  (0) 2008.09.18
4. IP-PBX의 기능과 역할  (0) 2008.09.18
2. VoIP 기술① : 프로토콜  (0) 2008.09.18
1. PSTN에서 VoIP로  (0) 2008.09.18
 

netstat -an 명령어는 현재 운영하고 있는 서버에 대한 외부의 네트워크 요청을 확인할 수 있는

유용한 명령어 입니다. 유닉스 뿐 아니라 윈도우에도 있네요...

 

Local Address는 자신의 아이피 입니다.

Foreign Address는 상대방의 아이피 입니다.

State는 접속방법입니다.

 

State의 대한 설명은 다음과 같습니다.

 

LISTEN : 현재열려있는 포트로써 누군가의 접속을 항상 기다리고 있는 포트입니다.

             즉 항상 열려있다는 뜻으로 허용한 포트 외의 포트가 Listening에 있다면

             그 원인을 잘 살펴봐야 합니다.

ESTABLISHED : 현재 정상적으로 연결이 된 포트로써 사용하고 있다는 의미입니다.

                       80번 포트에 이런 메시지가 있으면 웹브라우저를 통하고 홈폐이지

                       를 보고 있다는 뜻입니다. < 80번 포트는 인터넷 포트입니다. >

TIME_WAIT : 접속 후 사용이 종료되었으나 지정된 시간만큼 다른 명령이나 신호를

                   기다리고 있다는 의미입니다. 80번 포트는 웹브라우저의 요청에 대하여

                   홈폐이지 보여주기가 완전히 끝난뒤에도 다른 요청에 빨리 동작하기

                   위하여 15초정도 대기상태에 있습니다.

FIN_WAIT 1 : 포트가 닫혔으며 연결이 종료되기를 기다리는 상태입니다.

FIN_WAIT 2 : 연결이 완전히 닫힌 상태입니다.

SYN_SENT : 원격지에서 포트를 열려고 시도하는 중을 나타냅니다. 허용된 포트외의

                  다른포트에서 이런 메시지가 나오면 유심이 확인해 봐야 합니다.

UNKNOWN : 현재 포트의 상태를 알수 없다는 뜻 입니다.

 

간단하지만 이렇게 접속자정보와 state로 불법사용자여부를 확인하거나

웹서버의 경우 tcp 세션 현황을 모니터링 할 수 있습니다.

 

TCP session 상태가 "FIN_WAIT , TIME_WAIT" 와 같은 session의 정보가 장시간  다수 발생하는 경우

해당 tcp 세션을 clear 하기도 합니다.

 

예) ndd -set /dendd -set /dev/tcp tcp_discon 0x0001 (solaris나 hpux 의 경우 )

    rmsock  PCB/ADDR tcpcb (AIX의 경우)

 

하지만 정상적으로 "ESTABLISH" 상태인 session을 clear 하면
데이터 손실이나 시스템다운 등의 예상치 못한 결과가 생길 수 도 있다고 한다.

 
블로그 이미지

시반

시반(詩伴)이란 함께 시를 짓는 벗이란 뜻을 가지고 있습니다. 함께 나눌수 있는 그런 공간이길 바라며...

카테고리

분류 전체보기 (233)
개발 이야기 (73)
WEB2.0 (57)
DB2 (24)
MySQL (6)
오라클 (26)
기타 (44)
취미 (0)
잡담 (2)