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
1.2. Listener 모드의 사용
Listener 모드를 사용하기 위해서 다음과 같은 시나리오를 가정한다.
-
서버(A)는 8000번 Port로 SOAP 요청을 받아들인다.
-
클라이언트(B)의 웹 서비스 클라이언트가 송수신하는 SOAP 메시지를 모니터링하고자 한다.
이 경우 웹 서비스 클라이언트 프로그램에서는 tcpmon을 사용하여 SOAP 메시지를 모니터링할 수 있다.
클라이언트(B)에서 tcpmon을 실행한 뒤 다음과 같이 설정한다.
-
[Admin] 탭에서 'Listen Port'는 '9000’으로 입력하고 'Act as a'는 'Listener’를 선택한다. 'Listener'의 하위 항목인 'Target Hostname'는 'A', 'Target Port'는 '8000’으로 입력한다. 각각의 값을 입력한 후 [Add] 버튼을 클릭한다.
Listener 모드 입력 화면 -
다음과 같이 [Port 9000] 탭이 생성된다. 이 탭을 클릭하면 다음과 같은 화면이 나타난다.
모니터링 화면화면의 체크박스와 각 버튼에 대한 설명이다.
항목 설명 XML Format
XML을 보기 좋은 형태로 정렬하여 TCPMON 화면에 출력한다.
[Save] 버튼
현재 SOAP 메시지를 저장한다.
[Resend] 버튼
현재 Request SOAP 메시지를 재전송한다.
[Switch Layout] 버튼
메시지 출력 화면의 가로/세로 분할 모드를 바꾼다.
-
이렇게 설정한 후 클라이언트 프로그램에서 서버(A)의 8000번에 접속하는 대신 클라이언트(B)의 9000번에 접속하도록 한다. 그 후 클라이언트 프로그램을 실행하면 tcpmon이 9000번으로 들어온 요청을 받아서 서버(A)의 8000번 Port로 전송 후 응답을 받아서 클라이언트가 tcpmon에 연결한 커넥션의 응답으로 돌려주고 송수신한 메시지를 tcpmon에 출력한다.
tcpmon이 9000번으로 들어온 요청을 받아서 A의 8000번 Port로 전송
웹 서비스의 end-point 주소 변경
tcpmon을 Listener 모드로 사용하는 경우 웹 서비스의 end-point 주소를 바꾸기 위해서 클라이언트 프로그램이나 클라이언트의 설정을 변경할 필요가 있다.
-
J2SE JAX-WS 웹 서비스 클라이언트의 경우
접속하려는 웹 서비스의 end-point 주소를 바꾸기 위해서는 다음 예와 같이 코드를 수정한다.
(jakarta.xml.ws.BindingProvider)port).getRequestContext().put( jakarta.xml.ws.BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:9000/ws/AddNumbersService");
-
port
서비스 end-point 인터페이스에 대한 JAX-WS BindingProvider 객체이다.
-
jakarta.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