6장. GCF (Generic Connection Framework)
Introduction 1. GCF 소개 2. MIDP HTTPConnection 프로그래밍 4. MIDP StreamConnection 프로그래밍 5. MIDP DatagramConnection 프로그래밍
GCF 소개 (1) J2SE, J2EE 환경과 J2ME 환경차이 의 함으로써 해결이 가능.
GCF 소개 (2) J2SE, J2EE 플랫폼의 java.io, java.net 패키지를 사용할 수 없음. GCF 개념 - 가능한 넓은 범위의 휴대 장치를 지원하기 위해 입출력과 네트워크 를 추상화하고, 실제 구현은 각 장치 제조업체가 하도록 설계 GCF 설계 목적 - 서로 다른 형태의 입출력 형태를 일관성있게 지원 - 서로 다른 형태의 프로토콜을 일관성있게 지원 - 어플리케이션 이식성 향상 - 표준 자바 클래스 라이브러리와 상위 호환 - 더 작은 메모리 풋프린트를 가짐
GCF 소개 (3) GCF 구조도
MIDP Connection 생성 (1) connection은 일관성을 유지하기 위해 Connector class의 open - static Connection open (String name)
MIDP Connection 생성 (2) J2ME CLDC/MIDP에서 Connection을 생성하고 데이터를 주고 받는 절차 open() 메소드를 이용해 Connection을 연다. Connection을 이용해 InputStream 또는 OutputStream을 만든다. 데이터를 송신하거나 수신한다. Connection과 Input/Output Stream을 반드시 닫는다.
MIDP Connection 생성 (3) 1. Connection 열기 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();
MIDP Connection 생성 (4) 3. 데이터 송/수신 dis.readChar() ; dos.writeChar(); 4. Connection과 Input/Output Stream 닫기 c.close(); dis.close(); dos.close();
GCF API 설명 (1) Connection 인터페이스 StreamConnectionNotifier 인터페이스 닫는 기능만 한다. StreamConnectionNotifier 인터페이스 - 연결이 설정될 때까지 기다리기 위해 사용되는 연결형 Connection DatagramConnection 인터페이스 - UDP/IP 통신을 위해서 데이터그램 종단을 표현하기 위한 연결형 Connection 을 생성 InputConnection 인터페이스 - 데이터를 읽어 들일 수 있는 장치를 지정하는 인터페이스
GCF API 설명 (2) OutputConnection 인터페이스 StreamConnection 인터페이스 - 데이터를 전송할 수 있는 장치를 지정하는 인터페이스 StreamConnection 인터페이스 - InputConnection과 OutputConnection을 통합하기 위한 인터페이스 ContentConnection 인터페이스 - HTTP 연결에 의한 기본적인 메타 데이터 정보에 대한 접근을 제공 Connection 인터페이스 - ContentConnection을 상속하였으며, HTTP1.1을 지원하기 위해 사용 Connector 클래스 - GCF에서 유일한 클래스이며, open() 메소드의 파라미터로 부터 요청 한 Connection을 형성하여 돌려 준다.
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관리를 위해서 별도의 노력을 기울여야 하는 단점
HTTP GET 방식 데이터 요청 예제 (1) GET 방식은 가장 많이 사용하는 방식으로 웹 서버에서 정보를 받기 위한 URL 형식 - http://127.0.0.1/midp/servlet/MyServlet?name=scott&num=10 구성 Servlet MIDlet HttpGetServlet HttpGetMIDlet Get 방식 요청 ID, PassWord 로그인 결과
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");
HTTP GET 방식 데이터 요청 예제 (3) 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);
HTTP GET 방식 데이터 요청 예제 (4) HttpGetMIDlet 실행 화면
HTTP POST 방식 데이터 요청 예제 (1) GET 방식이 서버로부터 데이터를 받기 위한 목적으로 사용하는 것이라면 hc = (HttpConnection)Connector.open(url, Connector.READ_WRITE); hc.setRequestMethod(HttpConnection.POST); Servlet 예제 MIDlet 예제 Servlet은 클라이언트로부터 POST 방식 요청으로 UpperCase할 데이 터를 받은 후 결과를 클라이언트에 보낸다. 사용자로부터 UpperCase할 데이 터를 받은 후 Server에 Http Conn Ection의 POST 방식 요청을 보내 고 결과를 받아 출력한다.
HTTP POST 방식 데이터 요청 예제 (2) InputStream을 통해 데이터를 받음 (Servlet) 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);
HTTP POST 방식 데이터 요청 예제 (3) RequestMethod로 POST 생성(MIDlet) 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();
HTTP POST 방식 데이터 요청 예제 (4) HttpPostMIDlet 실행 화면
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 처리 문서 형식 – 클라이언트의 문서 지원 여부 확인
MIDP HTTPConnection 상태 유지 (1) 접속 상태를 유지하지 않는 프로토콜 한쌍의 Request – Reponse는 독립적으로 처리 Cookie 이란? Cookie는 클라이언트가 저장이 필요한 정보가 생길 때 마다 클라이언트 쪽에 일정한 형식의 데이터(Cookie)로 만들어 저장하고 필요한 서버와 서버의 디렉터리를 접근할 때 그 정보도 같이 서버에 보내주는 형태 Session이란? Session은 사용자의 정보를 유지 하기 위해 서버에 저장되는 Cookie라고 생각하면 된다
MIDP HTTPConnection 상태 유지 (2) Cookie 값 HTTP/1.1 200 OK Content-Type: text/plain Content-Length: 53 Date: Tue, 18 Dec 2001 17:19:22 GMT Server: Apache Tomcat/4.0.1 (HTTP/1.1 Connector) Set-Cookie: JSESSIONID=35E2621570C3B1D;Path=/midp 서버가 클라이언트의 접속에 대해 생성한 유일한 식별자
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); }
MIDP HTTPConnection 상태 유지 (4) SessionMIDlet 실행 화면
MIDP StreamConnection 프로그래밍 StreamConnection 인터페이스는 연결 지향형 Connection을 지원. 한번 접속하면 접속 종료 전까지 계속적으로 데이터를 주고 받음. TCP/IP Daemon - 시스템의 특정 포트를 열고 Background에서 실행되는 프로세스 StreamConnecton을 생성하기 위해 Connector의 open() 메소드 이용 - StreamConnection sc =(StreamConnection) Connector.open("socket://java.sun.com:1500 " )
StreamConnection 예제 (1) StreamConnectionServer 작업 흐름도 ServerSocket을 열고 클라이언트의 접속 대기 InputStream을 이용해 클라이언트에서 온 데이터를 받음 OutputStream을 이용해 데이터를 클라이언트로 보냄 클라이언트 접속 접속 대기
StreamConnection 예제 (2) Server Socket 생성 // Server Socket 생성 server = new ServerSocket(port); Client 접속을 기다림 System.out.println("클라이언트가 접속 하였습니다."); InputStream을 생성하고 데이터를 받음 in = new DataInputStream(client.getInputStream()); // Client로 부터 메세지를 받음 String input = in.readUTF(); // Output 메세지(Reverse String) 생성 OutputStream을 생성하고 데이터를 보냄 out = new DataOutputStream(client.getOutputStream()); // Client에 결과 메세지를 보냄 out.writeUTF(output); out.flush();
StreamConnection 예제 (3) StreamConnectionMIDlet 작업 흐름도 StreamConnection을 생성 InputStream을 이용해 서버에 데이터 전송 OutputStream을 이용해 데이터를 받아 출력
StreamConnection 예제 (4) // 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();
StreamConnection 예제 (5) StreamConnectionMIDlet 실행 화면
MIDP DatagramConnection 프로그래밍 Connector 클래스의 open 메소드를 사용 - (DatagramConnection) Connector.open ( " datagram:// java.sun.com:1500" ) 서버 모드의 DatagramConnection의 생성 - DatagramConnection dc = (DatagramConnection) Connector.open ( " datagram://:port " ) Connector.open ( " datagram://localhost:port " ) UDP (User Datagram Protocol) - IP를 사용하는 네트웍 내에서 컴퓨터들 간에 메시지들이 교환될 때 제한된 서비스만을 제공하는 통신 프로토콜이다. UDP는 TCP의 대안 - TCP와 마찬가지로 UDP도 한 컴퓨터에서 다른 컴퓨터로 데이터그램이라 고 불리는 실제 데이터 단위를 받기 위해 IP를 사용
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);
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 );
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);
MIDP DatagramConnection 프로그래밍 (4) DatagramConnectionMIDlet 실행 화면