1. tcpmon

본 절에서는 tcpmon 툴에 대해 설명한다.

1.1. 실행

tcpmon 프로그램은 송수신하는 TCP 패킷을 조회하는 프로그램으로 HTTP의 SOAP 메시지를 조회할 때 사용한다.

tcpmon은 다음의 2가지 모드로 동작한다.

모드 설명

Listener

tcpmon이 listen port로 요청을 받아서 지정된 target host와 target port로 받은 요청을 다시 전송하고 응답을 받아서 원래 요청한 커넥션으로 응답을 전송한다.

Proxy

tcpmon을 일반적인 HTTP Proxy처럼 동작하게 한다.

다음과 같이 tcpmon을 실행하면 tcpmon 실행 화면이 나타난다.

$ tcpmon
figure webservice tools tcpmon
tcpmon 실행 화면

1.2. Listener 모드의 사용

Listener 모드를 사용하기 위해서 다음과 같은 시나리오를 가정한다.

  • 서버(A)는 8000번 Port로 SOAP 요청을 받아들인다.

  • 클라이언트(B)의 웹 서비스 클라이언트가 송수신하는 SOAP 메시지를 모니터링하고자 한다.

figure webservice tools listenermode1
서버(A)가 8000번 포트로 SOAP 요청을 받아들이는 시나리오

이 경우 웹 서비스 클라이언트 프로그램에서는 tcpmon을 사용하여 SOAP 메시지를 모니터링할 수 있다.

클라이언트(B)에서 tcpmon을 실행한 뒤 다음과 같이 설정한다.

  1. [Admin] 탭에서 'Listen Port'는 '9000’으로 입력하고 'Act as a'는 'Listener’를 선택한다. 'Listener'의 하위 항목인 'Target Hostname'는 'A', 'Target Port'는 '8000’으로 입력한다. 각각의 값을 입력한 후 [Add] 버튼을 클릭한다.

    figure webservice tools listenermode2
    Listener 모드 입력 화면
  2. 다음과 같이 [Port 9000] 탭이 생성된다. 이 탭을 클릭하면 다음과 같은 화면이 나타난다.

    figure webservice tools listenermode3
    모니터링 화면

    화면의 체크박스와 각 버튼에 대한 설명이다.

    항목 설명

    XML Format

    XML을 보기 좋은 형태로 정렬하여 TCPMON 화면에 출력한다.

    [Save] 버튼

    현재 SOAP 메시지를 저장한다.

    [Resend] 버튼

    현재 Request SOAP 메시지를 재전송한다.

    [Switch Layout] 버튼

    메시지 출력 화면의 가로/세로 분할 모드를 바꾼다.

  3. 이렇게 설정한 후 클라이언트 프로그램에서 서버(A)의 8000번에 접속하는 대신 클라이언트(B)의 9000번에 접속하도록 한다. 그 후 클라이언트 프로그램을 실행하면 tcpmon이 9000번으로 들어온 요청을 받아서 서버(A)의 8000번 Port로 전송 후 응답을 받아서 클라이언트가 tcpmon에 연결한 커넥션의 응답으로 돌려주고 송수신한 메시지를 tcpmon에 출력한다.

    figure webservice tools listenermode4
    tcpmon이 9000번으로 들어온 요청을 받아서 A의 8000번 Port로 전송

웹 서비스의 end-point 주소 변경

tcpmon을 Listener 모드로 사용하는 경우 웹 서비스의 end-point 주소를 바꾸기 위해서 클라이언트 프로그램이나 클라이언트의 설정을 변경할 필요가 있다.

  • J2SE JAX-WS 웹 서비스 클라이언트의 경우

    접속하려는 웹 서비스의 end-point 주소를 바꾸기 위해서는 다음 예와 같이 코드를 수정한다.

    (javax.xml.ws.BindingProvider)port).getRequestContext().put(
        javax.xml.ws.BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
        "http://localhost:9000/ws/AddNumbersService");
    • port

      서비스 end-point 인터페이스에 대한 JAX-WS BindingProvider 객체이다.

    • javax.xml.ws.BindingProvider.ENDPOINT_ADDRESS_PROPERTY

      end-point 주소를 지정하기 위한 JAX-WS 스펙에서 정의한 표준 속성이다.

  • J2SE JAX-RPC 웹 서비스 클라이언트의 경우

    접속하려는 웹 서비스의 end-point 주소를 바꾸기 위해서는 다음 예와 같이 코드를 수정한다.

    ((javax.xml.rpc.Stub)port)._setProperty(
          javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY,
          “http://localhost:9000/ws/AddressBookService”);
    • port

      서비스 end-point 인터페이스에 대한 JAX-RPC Stub 객체이다.

    • javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY

      end-point 주소를 지정하기 위한 JAX-RPC 스펙에서 정의한 표준 속성이다.

  • J2EE 웹 서비스 클라이언트의 경우

    코드 수정 없이 JEUS 설정 파일(jeus-web-dd.xml 또는 jeus-ejb-dd.xml)을 <service-client>에 <stub-property>를 추가하여 위의 속성을 적용할 수 있다.

    <service-client>
        <port-info>
            <stub-property>
                <name>javax.xml.rpc.service.endpoint.address</name>
                <value>
                    http://localhost:9000/ws/AddressBookService
                </value>
            </stub-property>
        </port-info>
    </service-client>

1.3. Proxy 모드의 사용

Proxy 모드는 tcpmon을 일반적인 HTTP Proxy처럼 동작하게 한다. Proxy 모드는 [Admin] 탭에서 'Listen Port'를 입력하고 'Act as a'Proxy를 선택하고 [Add] 버튼을 클릭해서 사용한다.

Proxy 모드의 경우 애플리케이션을 수정하지 않고 애플리케이션을 실행할 때 다음의 옵션을 설정하여 tcpmon을 사용할 수 있다.

옵션 설명

-Dhttp.proxyHost

tcpmon이 수행되고 있는 Host 이름 또는 IP 주소를 입력한다.

-Dhttp.proxyPort

tcpmon의 Listen Port를 입력한다.

클라이언트 애플리케이션이 com.acme.AddressBookClient 클래스인 경우 다음과 같이 옵션을 설정하여 java를 실행한다.

java –Dhttp.proxyHost=B –Dhttp.proxyPort=9000 com.acme.AddressBookClient

1.4. 기타 기능

각 Port별 탭에서 SOAP 메시지를 formatting하거나 저장 또는 재전송을 할 수 있다.