1
6 장 . GCF (Generic Connection Framework)
2
Introduction
1. GCF 소개 2. MIDP HTTPConnection 프로그래밍
3. MIDP HTTPConnection 상태 유지
4. MIDP StreamConnection 프로그래밍
5. MIDP DatagramConnection 프로그래밍
3
GCF 소개 (1)
• J2SE, J2EE 환경과 J2ME 환경차이 - J2SE 와 J2EE 의 입출력과 네트워크의 라이브러리를 사용하기에는 무리가 따른다 . 이러한 입출력과 네트워크에 대한 문제는 GCF 를 정 의 함으로써 해결이 가능 .
4
GCF 소개 (2)
• J2SE, J2EE 플랫폼의 java.io, java.net 패키지를 사용할 수 없음 .
• GCF 개념
- 가능한 넓은 범위의 휴대 장치를 지원하기 위해 입출력과 네트워크 를 추상화하고 , 실제 구현은 각 장치 제조업체가 하도록 설계
• GCF 설계 목적
- 서로 다른 형태의 입출력 형태를 일관성있게 지원 - 서로 다른 형태의 프로토콜을 일관성있게 지원 - 어플리케이션 이식성 향상 - 표준 자바 클래스 라이브러리와 상위 호환 - 더 작은 메모리 풋프린트를 가짐
5
GCF 소개 (3)
• GCF 구조도
6
MIDP Connection 생성 (1)
• connection 은 일관성을 유지하기 위해 Connector class 의 open 메소드 하나를 사용하여 모든 Connection 을 생성
• open 메소드 정의
- static Connection open (String name)
7
MIDP Connection 생성 (2)
• J2ME CLDC/MIDP 에서 Connection 을 생성하고 데이터를 주고 받는 절차
open() 메소드를 이용해 Connection 을 연다 .
Connection 을 이용해 InputStream 또는 OutputStream 을 만든다 .
데이터를 송신하거나 수신한다 .
Connection 과 Input/Output Stream 을 반드시 닫는다 .
8
MIDP Connection 생성 (3)
1. Connection 열기
HttpConnection c = (HttpConnection) Connector.open( "http://aaa.bbb.ccc:80")
StreamConnection c = (StreamConnection) Connector.open("socket://aaa.bbb.ccc:1234")
DatagramConnection c = (DatagramConnection) Connector.open(“datagram://aaa.bbb.ccc:1234)
2. InputStream or OutputStream 만듬
DataInputStream dis = c.openDataInputStream();
DataOutputStream dos = c.openDataOutputStream();
9
MIDP Connection 생성 (4)
3. 데이터 송 / 수신
dis.readChar() ;
dos.writeChar();
4. Connection 과 Input/Output Stream 닫기
c.close();
dis.close();
dos.close();
10
GCF API 설명 (1)
• Connection 인터페이스
- GCF 에서 가장 기본이 되는 최상위 인터페이스로서 단지 열리고 닫는 기능만 한다 .
• StreamConnectionNotifier 인터페이스
- 연결이 설정될 때까지 기다리기 위해 사용되는 연결형 Connection
• DatagramConnection 인터페이스
- UDP/IP 통신을 위해서 데이터그램 종단을 표현하기 위한 연결형 Connection 을 생성
• InputConnection 인터페이스
- 데이터를 읽어 들일 수 있는 장치를 지정하는 인터페이스
11
GCF API 설명 (2)
• OutputConnection 인터페이스 - 데이터를 전송할 수 있는 장치를 지정하는 인터페이스
• StreamConnection 인터페이스 - InputConnection 과 OutputConnection 을 통합하기 위한 인터페이스
• ContentConnection 인터페이스 - HTTP 연결에 의한 기본적인 메타 데이터 정보에 대한 접근을 제공
• Connection 인터페이스 - ContentConnection 을 상속하였으며 , HTTP1.1 을 지원하기 위해 사용
• Connector 클래스 - GCF 에서 유일한 클래스이며 , open() 메소드의 파라미터로 부터 요청 한 Connection 을 형성하여 돌려 준다 .
12
MIDP HTTPConnection 프로그래밍
• HttpConnection 인터페이스를 사용 했을 때 장단점
- J2ME CLDC/MIDP 를 구현한 디바이스에서 HTTP Connection 의 지원은 필수이며 , Socket, UDP 등 기타 Connection 의 구현은 선택 사항이다 . 이식성이 우수
- HTTP Connection 을 사용하면 방화벽에서 일반적으로 열어 두는 80 포트 를 사용하기 때문에 네트워크 보안이나 방화벽 문제를 쉽게 처리 가능
- HTTP Connection 의 Request 에 XML 의 데이터를 보내게 되면 다른 형태 의 데이터를 손쉽게 전송
- J2ME CLDC/MIDP 는 HTTP 1.1 프로토콜의 서브 셋을 지원
- HTTP 프로토콜이 연결 지속성이 아니라서 Session 관리를 위해서 별도의 노력을 기울여야 하는 단점
13
HTTP GET 방식 데이터 요청 예제 (1)
• GET 방식은 가장 많이 사용하는 방식으로 웹 서버에서 정보를 받기 위한 요청
• URL 형식
- http://127.0.0.1/midp/servlet/MyServlet?name=scott&num=10
• 구성
Servlet MIDlet
HttpGetServlet HttpGetMIDlet
Get 방식 요청ID, PassWord
로그인 결과
14
HTTP GET 방식 데이터 요청 예제 (2)
• HttpGetServlet 을 생성하고 GET 방식으로 요청을 설정하는 부분
hc = (HttpConnection)Connector.open(url + queryString);
hc.setRequestMethod(HttpConnection.GET);
• getParameter() 메소드를 이용해 GET 방식 요청
// request 로 부터 ID, PASSWORD 를 얻어옴
id = request.getParameter("id");
password = request.getParameter("password");
15
HTTP GET 방식 데이터 요청 예제 (3)
• GET 요청을 위해 QueryString 을 생성
// GET 요청을 위해 queryString 을 생성
queryString = "?" + "id=" + idField.getString() + "&" + "password=" + pwField.getString();
• HttpConnection 을 생성
// HTTP Connection 을 생성
hc = (HttpConnection)Connector.open(url + queryString);
• RequestMethod 로 GET 설정
// RequestMethod 로 GET 설정
hc.setRequestMethod(HttpConnection.GET);
16
HTTP GET 방식 데이터 요청 예제 (4)
• HttpGetMIDlet 실행 화면
17
HTTP POST 방식 데이터 요청 예제 (1)
• GET 방식이 서버로부터 데이터를 받기 위한 목적으로 사용하는 것이라면 POST 방식은 그 반대의 기능을 제공 • GET 방식 요청이 허용하는 것 보다 많은 정보를 전달하기 위해 사용됨 .
• HttpConnection 을 생성하고 POST 방식 요청을 설정하는 부분
hc = (HttpConnection)Connector.open(url, Connector.READ_WRITE);
hc.setRequestMethod(HttpConnection.POST);
Servlet 은 클라이언트로부터 POST 방식 요청으로 UpperCase 할 데이터를 받은 후 결과를 클라이언트에 보낸다 .
사용자로부터 UpperCase 할 데이터를 받은 후 Server 에 Http ConnEction 의 POST 방식 요청을 보내고 결과를 받아 출력한다 .
Servlet 예제 MIDlet 예제
18
HTTP POST 방식 데이터 요청 예제 (2)
• InputStream 을 통해 데이터를 받음 (Servlet)
// InputStream 생성 BufferedReader inputStream = request.getReader();
// Input String 을 받음 String line;
String requeststring = "";
while (( line = inputStream.readLine()) != null) { requeststring = requeststring + line;
• HttpConnection 을 생성 (MIDlet)
// HTTP Connection 을 생성
hc = (HttpConnection)Connector.open(url, Connector.READ_WRITE);
19
HTTP POST 방식 데이터 요청 예제 (3)
• RequestMethod 로 POST 생성 (MIDlet)
// RequestMethod 로 POST 설정
hc.setRequestMethod(HttpConnection.POST);
• OutputStream 을 통해 데이터를 전달 (MIDlet)
// 서버로 부터 데이타를 받기 위해 outputStream 생성
out = hc.openDataOutputStream();
// 서버에 요청 스트링을 보낸다 .
byte[] request = requeststring.getBytes();
for (int i = 0; i < request.length; i++){ out.writeByte(request[i]);}out.flush();
20
HTTP POST 방식 데이터 요청 예제 (4)
• HttpPostMIDlet 실행 화면
21
HTTP HEAD 방식 데이터 요청 예제
• GET 방식과 유사• 서버는 HEAD 에 대한 정보만 돌려 보낸다 .
• HEAD 정보 HTTP/1.0 200 OK Data: Thu, 03 May 2002 16:04:09 GMT Server: NCSA/1.4.2 MIME-version: 1.0 Content-type: text/html Last-modified: Thu, 03 May 2002 16:03:27 GMT Content-length: 145
• HEAD 는 다음의 정보 확인을 위해 사용Server 문서의 최근 modified 날짜 다운 받을 문서의 크기 – 다운 로드 진행 상태를 알 수 있다 .Server Type – Server 에 따른 Client 처리문서 형식 – 클라이언트의 문서 지원 여부 확인
22
MIDP HTTPConnection 상태 유지 (1)
• 접속 상태를 유지하지 않는 프로토콜
• 한쌍의 Request – Reponse 는 독립적으로 처리
Cookie 이란 ?
Cookie 는 클라이언트가 저장이 필요한 정보가 생길 때 마다 클라이언트 쪽에 일정한 형식의 데이터 (Cookie) 로 만들어 저장하고 필요한 서버와 서버의 디렉터리를 접근할 때 그 정보도 같이 서버에 보내주는 형태
Session 이란 ?
Session 은 사용자의 정보를 유지 하기 위해 서버에 저장되는 Cookie 라고 생각하면 된다
23
MIDP HTTPConnection 상태 유지 (2)
• Cookie 값
HTTP/1.1 200 OKContent-Type: text/plainContent-Length: 53Date: Tue, 18 Dec 2001 17:19:22 GMTServer: Apache Tomcat/4.0.1 (HTTP/1.1 Connector)
Set-Cookie: JSESSIONID=35E2621570C3B1D;Path=/midp
서버가 클라이언트의 접속에 대해 생성한 유일한 식별자
24
MIDP HTTPConnection 상태 유지 (3)
• 유일한 식별자인 JSESSIONID 을 Cookie 로 설정해 서버에 보낸다 .
hc.setRequestProperty("Cookie", sessionID);
• 서버의 응답으로부터 Cookie 를 얻는다 .
String cookie = hc.getHeaderField("Set-Cookie");
• Cookie 중에 유일한 식별자인 JSESSIONID 을 얻는다 .
// cookie 에서 JSESSIONID 를 얻는다 . if (cookie != null) { int index = cookie.indexOf(';');
sessionID = cookie.substring(0, index); }
25
MIDP HTTPConnection 상태 유지 (4)
• SessionMIDlet 실행 화면
26
MIDP StreamConnection 프로그래밍
• StreamConnection 인터페이스는 연결 지향형 Connection 을 지원 .
• 한번 접속하면 접속 종료 전까지 계속적으로 데이터를 주고 받음 .
• TCP/IP
• Daemon - 시스템의 특정 포트를 열고 Background 에서 실행되는 프로세스
• StreamConnecton 을 생성하기 위해 Connector 의 open() 메소드 이용
- StreamConnection sc =(StreamConnection) Connector.open("socket://java.sun.com:1500 " )
27
StreamConnection 예제 (1)
• StreamConnectionServer 작업 흐름도 ServerSocket 을 열고 클라이언트의 접속 대기
InputStream 을 이용해 클라이언트에서 온 데이터를 받음
OutputStream 을 이용해 데이터를 클라이언트로 보냄
클라이언트 접속 접속 대기
28
StreamConnection 예제 (2)
• Server Socket 생성// Server Socket 생성server = new ServerSocket(port);
• Client 접속을 기다림System.out.println(" 클라이언트가 접속 하였습니다 .");
• OutputStream 을 생성하고 데이터를 보냄out = new DataOutputStream(client.getOutputStream());// Client 에 결과 메세지를 보냄out.writeUTF(output);out.flush();
• InputStream 을 생성하고 데이터를 받음in = new DataInputStream(client.getInputStream());// Client 로 부터 메세지를 받음String input = in.readUTF();// Output 메세지 (Reverse String) 생성
29
StreamConnection 예제 (3)
• StreamConnectionMIDlet 작업 흐름도
StreamConnection 을 생성
InputStream 을 이용해 서버에 데이터 전송
OutputStream 을 이용해 데이터를 받아 출력
30
StreamConnection 예제 (4)
• StreamConnection 생성// Server 와 StreamConnection(Socket) 을 생성sc = (StreamConnection) Connector.open (url, Connector.READ_WRITE, true);
• OutputStream 생성 후 데이터를 보냄
// Server 에 reverse 할 String 을 보냄out = sc.openDataOutputStream();out.writeUTF(reverseString);out.flush();
• InputStream 생성 후 데이터를 받음
// InputStream 생성in = sc.openDataInputStream();// Server 로 부터 reverse 된 String 을 받아 화면에 출력 .String input = in.readUTF();
31
StreamConnection 예제 (5)
• StreamConnectionMIDlet 실행 화면
32
MIDP DatagramConnection 프로그래밍
• Connector 클래스의 open 메소드를 사용
- (DatagramConnection) Connector.open ( " datagram:// java.sun.com:1500" )
• 서버 모드의 DatagramConnection 의 생성
- DatagramConnection dc = (DatagramConnection) Connector.open ( " datagram://:port " )
- DatagramConnection dc = (DatagramConnection) Connector.open ( " datagram://localhost:port " )
• UDP (User Datagram Protocol)
- IP 를 사용하는 네트웍 내에서 컴퓨터들 간에 메시지들이 교환될 때 제한된 서비스만을 제공하는 통신 프로토콜이다 . UDP 는 TCP 의 대안
- TCP 와 마찬가지로 UDP 도 한 컴퓨터에서 다른 컴퓨터로 데이터그램이라 고 불리는 실제 데이터 단위를 받기 위해 IP 를 사용
33
DatagramConnection 예제 (1)
• DatagramConnectionServer
- 클라이언트와 Datagram Connection 을 유지하고 받은 데이터를 Reverse String 으로 변환한 결과를 클라이언트로 보냄
1. DatagramSocket 을 서버모드로 생성
// receive DatagramSocket 생성
recei = new DatagramSocket(port);
2. 클라이언트로부터 데이터를 받기 위해 DatagramPacket 을 생성하고 데이
터를 기다림
rPacket = new DatagramPacket( buffer, buffer.length );
recei.receive(rPacket);
34
DatagramConnection 예제 (2)
3. 클라이언에 보낼 DatagramPacket 을 생성
// Client 에 보낼 DatagramPacket 생성
int sPort = rPacket.getPort();
InetAddress sAddress = rPacket.getAddress();
sPacket = new DatagramPacket( out, out.length, sAddress, sPort );
4. 클라이언트에 데이터를 보냄
// 결과 DatagramPacket 을 Client 에 보냄
send = new DatagramSocket();
send.send( sPacket );
35
DatagramConnection 예제 (3)
• DatagramConnectionMIDlet
1. Server 에 보낼 Datagram 을 생성 후 데이터를 보냄
// DatagramConnection 을 생성dc = (DatagramConnection)Connector.open(sendUrl);
// Server 에 보낼 Datagram 생성dgram = dc.newDatagram( reverseString.getBytes(), reverseString.getBytes().length, sendUrl);
// Server 에 Datagram 을 보냄dc.send(dgram);
2. Server 로부터 받을 Datagram 을 생성 후 Server 로부터 데이터를 받음 // Server 로 부터 받을 Datagram 생성dgram = dc.newDatagram(128);
dc.receive(dgram);
36
MIDP DatagramConnection 프로그래밍 (4)
• DatagramConnectionMIDlet 실행 화면