Transcript
Page 1: 6 장 . GCF  (Generic Connection Framework)

1

6 장 . GCF (Generic Connection Framework)

Page 2: 6 장 . GCF  (Generic Connection Framework)

2

Introduction

1. GCF 소개 2. MIDP HTTPConnection 프로그래밍

3. MIDP HTTPConnection 상태 유지

4. MIDP StreamConnection 프로그래밍

5. MIDP DatagramConnection 프로그래밍

Page 3: 6 장 . GCF  (Generic Connection Framework)

3

GCF 소개 (1)

• J2SE, J2EE 환경과 J2ME 환경차이 - J2SE 와 J2EE 의 입출력과 네트워크의 라이브러리를 사용하기에는 무리가 따른다 . 이러한 입출력과 네트워크에 대한 문제는 GCF 를 정 의 함으로써 해결이 가능 .

Page 4: 6 장 . GCF  (Generic Connection Framework)

4

GCF 소개 (2)

• J2SE, J2EE 플랫폼의 java.io, java.net 패키지를 사용할 수 없음 .

• GCF 개념

- 가능한 넓은 범위의 휴대 장치를 지원하기 위해 입출력과 네트워크 를 추상화하고 , 실제 구현은 각 장치 제조업체가 하도록 설계

• GCF 설계 목적

- 서로 다른 형태의 입출력 형태를 일관성있게 지원 - 서로 다른 형태의 프로토콜을 일관성있게 지원 - 어플리케이션 이식성 향상 - 표준 자바 클래스 라이브러리와 상위 호환 - 더 작은 메모리 풋프린트를 가짐

Page 5: 6 장 . GCF  (Generic Connection Framework)

5

GCF 소개 (3)

• GCF 구조도

Page 6: 6 장 . GCF  (Generic Connection Framework)

6

MIDP Connection 생성 (1)

• connection 은 일관성을 유지하기 위해 Connector class 의 open 메소드 하나를 사용하여 모든 Connection 을 생성

• open 메소드 정의

- static Connection open (String name)

Page 7: 6 장 . GCF  (Generic Connection Framework)

7

MIDP Connection 생성 (2)

• J2ME CLDC/MIDP 에서 Connection 을 생성하고 데이터를 주고 받는 절차

open() 메소드를 이용해 Connection 을 연다 .

Connection 을 이용해 InputStream 또는 OutputStream 을 만든다 .

데이터를 송신하거나 수신한다 .

Connection 과 Input/Output Stream 을 반드시 닫는다 .

Page 8: 6 장 . GCF  (Generic Connection Framework)

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();

Page 9: 6 장 . GCF  (Generic Connection Framework)

9

MIDP Connection 생성 (4)

3. 데이터 송 / 수신

dis.readChar() ;

dos.writeChar();

4. Connection 과 Input/Output Stream 닫기

c.close();

dis.close();

dos.close();

Page 10: 6 장 . GCF  (Generic Connection Framework)

10

GCF API 설명 (1)

• Connection 인터페이스

- GCF 에서 가장 기본이 되는 최상위 인터페이스로서 단지 열리고 닫는 기능만 한다 .

• StreamConnectionNotifier 인터페이스

- 연결이 설정될 때까지 기다리기 위해 사용되는 연결형 Connection

• DatagramConnection 인터페이스

- UDP/IP 통신을 위해서 데이터그램 종단을 표현하기 위한 연결형 Connection 을 생성

• InputConnection 인터페이스

- 데이터를 읽어 들일 수 있는 장치를 지정하는 인터페이스

Page 11: 6 장 . GCF  (Generic Connection Framework)

11

GCF API 설명 (2)

• OutputConnection 인터페이스 - 데이터를 전송할 수 있는 장치를 지정하는 인터페이스

• StreamConnection 인터페이스 - InputConnection 과 OutputConnection 을 통합하기 위한 인터페이스

• ContentConnection 인터페이스 - HTTP 연결에 의한 기본적인 메타 데이터 정보에 대한 접근을 제공

• Connection 인터페이스 - ContentConnection 을 상속하였으며 , HTTP1.1 을 지원하기 위해 사용

• Connector 클래스 - GCF 에서 유일한 클래스이며 , open() 메소드의 파라미터로 부터 요청 한 Connection 을 형성하여 돌려 준다 .

Page 12: 6 장 . GCF  (Generic Connection Framework)

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 관리를 위해서 별도의 노력을 기울여야 하는 단점

Page 13: 6 장 . GCF  (Generic Connection Framework)

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

로그인 결과

Page 14: 6 장 . GCF  (Generic Connection Framework)

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");

Page 15: 6 장 . GCF  (Generic Connection Framework)

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);

Page 16: 6 장 . GCF  (Generic Connection Framework)

16

HTTP GET 방식 데이터 요청 예제 (4)

• HttpGetMIDlet 실행 화면

Page 17: 6 장 . GCF  (Generic Connection Framework)

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 예제

Page 18: 6 장 . GCF  (Generic Connection Framework)

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);

Page 19: 6 장 . GCF  (Generic Connection Framework)

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();

Page 20: 6 장 . GCF  (Generic Connection Framework)

20

HTTP POST 방식 데이터 요청 예제 (4)

• HttpPostMIDlet 실행 화면

Page 21: 6 장 . GCF  (Generic Connection Framework)

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 처리문서 형식 – 클라이언트의 문서 지원 여부 확인

Page 22: 6 장 . GCF  (Generic Connection Framework)

22

MIDP HTTPConnection 상태 유지 (1)

• 접속 상태를 유지하지 않는 프로토콜

• 한쌍의 Request – Reponse 는 독립적으로 처리

Cookie 이란 ?

Cookie 는 클라이언트가 저장이 필요한 정보가 생길 때 마다 클라이언트 쪽에 일정한 형식의 데이터 (Cookie) 로 만들어 저장하고 필요한 서버와 서버의 디렉터리를 접근할 때 그 정보도 같이 서버에 보내주는 형태

Session 이란 ?

Session 은 사용자의 정보를 유지 하기 위해 서버에 저장되는 Cookie 라고 생각하면 된다

Page 23: 6 장 . GCF  (Generic Connection Framework)

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

서버가 클라이언트의 접속에 대해 생성한 유일한 식별자

Page 24: 6 장 . GCF  (Generic Connection Framework)

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); }

Page 25: 6 장 . GCF  (Generic Connection Framework)

25

MIDP HTTPConnection 상태 유지 (4)

• SessionMIDlet 실행 화면

Page 26: 6 장 . GCF  (Generic Connection Framework)

26

MIDP StreamConnection 프로그래밍

• StreamConnection 인터페이스는 연결 지향형 Connection 을 지원 .

• 한번 접속하면 접속 종료 전까지 계속적으로 데이터를 주고 받음 .

• TCP/IP

• Daemon - 시스템의 특정 포트를 열고 Background 에서 실행되는 프로세스

• StreamConnecton 을 생성하기 위해 Connector 의 open() 메소드 이용

- StreamConnection sc =(StreamConnection) Connector.open("socket://java.sun.com:1500 " )

Page 27: 6 장 . GCF  (Generic Connection Framework)

27

StreamConnection 예제 (1)

• StreamConnectionServer 작업 흐름도 ServerSocket 을 열고 클라이언트의 접속 대기

InputStream 을 이용해 클라이언트에서 온 데이터를 받음

OutputStream 을 이용해 데이터를 클라이언트로 보냄

클라이언트 접속 접속 대기

Page 28: 6 장 . GCF  (Generic Connection Framework)

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) 생성

Page 29: 6 장 . GCF  (Generic Connection Framework)

29

StreamConnection 예제 (3)

• StreamConnectionMIDlet 작업 흐름도

StreamConnection 을 생성

InputStream 을 이용해 서버에 데이터 전송

OutputStream 을 이용해 데이터를 받아 출력

Page 30: 6 장 . GCF  (Generic Connection Framework)

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();

Page 31: 6 장 . GCF  (Generic Connection Framework)

31

StreamConnection 예제 (5)

• StreamConnectionMIDlet 실행 화면

Page 32: 6 장 . GCF  (Generic Connection Framework)

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 를 사용

Page 33: 6 장 . GCF  (Generic Connection Framework)

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);

Page 34: 6 장 . GCF  (Generic Connection Framework)

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 );

Page 35: 6 장 . GCF  (Generic Connection Framework)

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);

Page 36: 6 장 . GCF  (Generic Connection Framework)

36

MIDP DatagramConnection 프로그래밍 (4)

• DatagramConnectionMIDlet 실행 화면