Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 105 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
105
Dung lượng
1,55 MB
Nội dung
Header Page of 113 Mục lục ChươngI: Giới thiệu tổng quan Lý chọn dề tài…………………………………………….….3 Mục Tiêu………………………………………….…………… 3 Đối tượng nghiên cứu…………………………………….…….4 Phạm vi nghiên cứu……………………………………….… Môi trường thực hiện………………………………….……….4 Giới thiệu Java công nghệ J2ME …………………… Giới thiệu Java…………………………………… Giới thiệu J2MElậptrình J2ME…………………… 6.1 Tại chọn J2ME……………………………………….7 6.2 Kiến trúc J2ME…………………………………… 6.3 Phát triển ứng dụng…………………………………… 11 6.4 Kiểm tra lỗi chạy thử……………………………… 11 6.5 Đóng gói ứng dụng…………………………… 12 6.6 Triển khai ứng dụng với tập tin JAR………………… 12 6.7 Tập tin manifest.mf tập tin JAD………………… 12 6.8 Tối ưu mã giảm kích thước ứng dụng…………… 13 6.9 Những khó khăn…………………………………….… 14 Chương II: Lậptrình với J2ME……………… …………….……16 MIDlet đối tượng Display…………………….…….….….16 1.1 MIDlet – Vòng đời MIDlet…………….….….16 1.2 Đối tượng Display………………………………………19 1.3 Đối tượng Displayable…………………………….… 19 Giao diện người dùng cấp cao………………………….……20 Footer Page of 113 Header Page of 113 2.1 Đối tượng Display, Displayable Screen…………… 20 2.2 Thành phần Form Items………………………….… 21 2.3 Thành phần List, Textbox, Alert, Ticker… .33 Giao diện người dùng câp thấp…………………… ………….39 3.1 Các hàm API mức thấp………………………….……… 39 3.2 Lớp Canvas kỹ thuật xử lý đồ họa………….……… 39 3.3 Lớp Graphics…………………………………….……… 49 Chương III: Hệ thống quản lý ghi………………………………64 Lưu trữ cố định thông qua RecordStore……………… ….64 Các vấn đề với RMS…………………………………… … 67 Các hàm API RMS…………………………….…….… 68 Sắp xếp ghi với RecordComparator……………….… 73 Tìm kiếm ghi với RecordFilter……………… ……… 83 Nhận biết thay đổi với RecordListener………………… …88 Chương IV: Khung kết nối chung……………………………………93 Cây phân cấp Connection………………………… ……… 93 Kết nối HTTP…………………………………………….… 95 Client Request Server Response……………… …… 100 Chương V: Tổng kết………………………………………….…… 104 Tài liệu tham khảo ………………………………………………… 105 Footer Page of 113 Header Page of 113 CHƯƠNG I: GIỚI THIỆU TỔNG QUAN Lý chọn đềtài Công nghệ thông tin ngày có vai trò quan trọng sống hàng ngày Hiện có nhiều công nghệ phát triển song song với việc phát triển công nghệ thông tin Bluetooth, Wireless, WAP, SOAP,… nhằm giúp công nghệ thông tin ngày thân thiết với người dùng Một công nghệ góp phần không nhỏ việc kết nối người với thông tin người với người công nghệ di động.Với tốc độ phát triển lợi ích to lớn công nghệ di động, thấy có ảnh hưởng lớn đến sống người Không giống trước điện thoại có chức đơn giản đàm thoại, điện thoại có thêm nhiều chức năng, ứng dụng khác như: email, truy cập Internet, video, nghe nhạc, chơi game, … đồng thời với phát triển vũ bão dịch vụ gia tăng điện thoại diđộng dựa công nghệ WAP SOAP Em chọn đềtài “Lập trìnhthiếtbịdiđộng J2ME” viết số ứng dụng đơn giản nhằm khai thác tính thiếtbịdiđộng mà chủ yếu điện thoại diđộng Qua em cố gắng nắm bắt ứng dụng tốt kỹ thuật lậptrìnhthiếtbịdiđộng Mục tiêu Khi thực đềtài này, mục tiêu mà em mong muốn đạt là: Hiểu chi tiết J2ME ứng dụng đểlậptrìnhthiếtbịdiđộng Nắm kỹ thuật xử lý form, âm thanh, hình ảnh, lưu trữ điện thoại diđộng Ứng dụng kết đạt để xây dựng chương trình đơn giản, có tiện ích phục vụ nhu cầu người sử dụng điện thoại diđộng Áp dụng thành công số dòng máy điện thoại diđộng hỗ trợ Java hãng Nokia, Sony, Samsung,… Footer Page of 113 Header Page of 113 Đối tượng nghiên cứu Hiểu chi tiết J2ME ứng dụng đểlậptrìnhthiếtbịdiđộng Nắm kỹ thuật xử lý âm thanh, hình ảnh, lưu trữ liệu thiếtbịdiđộng Ứng dụng kết có để xây dựng ứng dụng thực tiễn thiếtbịdiđộng Tìm hiểu công nghệ nâng cao điện thoại diđộng Bluetooth, WAP, SOAP Tìm hiểu nguyên lý hoạt động dịch vụ gia tăng điện thoại diđộng Nếu thời gian, tìm hiểu ý tưởng lậptrình phân tán thiếtbịdiđộng Đây ý tưởng chưa áp dụng cho thiếtbịdiđộng Phạm vi nghiên cứu Nghiên cứu chi tiết công nghệ J2ME kỹ thuật lậptrình điên thoại diđộng Ứng dụng kết nghiên cứu để xây dựng ứng dụng triển khai điện thoại diđộng Vì thời gian có hạn khả tìm hiểu nhiều hạn chế nên em trình bày kỹ thuật lậptrình số dòng điện thoại phổ biển hãng lớn Nokia, Samsung, Sony Ericssion Em cố gắng khai thác mạnh form, âm thanh, hình ảnh mà nhà sản xuất cung cấp điện thoại diđộng họ Do đủ thiếtbịđể nghiên cứu nên em trình bày kỹ thuật lậptrình điện thoại diđộngthiếtbịdiđộng khác nói chung Do đềtài này, cụm từ “thiết bịdi động” hiểu theo nghĩa “điện thoại di động” Môi trường thực Hệ điều hành Windows XP IDE: NetBeans 5.5, NetBeans Mobility Pack 5.5.1 ( kèm WTK 2.5) JDK 1.6.02 Sun Wireless Toolkit 2.2 Footer Page of 113 Header Page of 113 Giới thiệu Java công nghệ J2ME Giới thiệu Java Java công nghệ hãng Sun Microsystems xây dựng từ cuối năm 1990 với tên Oak phát triển vượt bậc với đóng góp hàng vạn lậptrình viên giới Ban đầu, Oak kỹ sư James Gosling cộng xây dựng với mục đích lậptrình cho mặt hàng điện dân dụng với mục tiêu nhỏ gọn tương thích với nhiều loại thiếtbị phần cứng khác Sau Oak sử dụng nhiều dự án dự án Xanh (Blue Project), dự án Phim theo yêu cầu (Video on demand Project) Sau chuyến du lịch tới đảo Java Indonesia, nhóm phát triển Oak đổi tên Oak thành Java Java mà tiền thân Oak xây dựng chủ yếu dựa công cụ phát triển (Java Development Kit - JDK) thư viện chuẩn chưa trình biên dịch, trình thông dịch, trìnhđóng gói, tài liệu,… Đây tằng cho việc phát triển ứng dụng Java Hiện nay, cộng đồng Java giới mà đầu hãng Sun Microsystems xây dựng nhiều nhánh cho Java như: JavaMail (thư điện tử), Java TAPI (viễn thông), Java3D (đồ họa chiều), J2ME (ứng dụng cho thiếtbịdi động),… Hiện Java có phiên sau: J2SETM (Java Platform, Standart Edition): Phiên chuẩn gồm công cụ thông dụng dùng để chạy máy PC mạng máy tính nhỏ J2EETM (Java Platform, Enterprise Edition): Phiên dành cho máy chủ với nhớ lớn Bao gồm kiến trúc nâng cao Web, EJB, Transaction,… dùng để xây dựng ứng dụng có quy mô lớn Footer Page of 113 Header Page of 113 J2METM (Java Platform, Micro Edition): Bao gồm môi trường thư viện Java dùng để phát triển ứng dụng thiếtbị có nhớ nhỏ điện thoại di động, PDA, đồ gia dụng,… Giới thiệu J2MElậptrình cho thiếtbịdiđộngJ2ME phát triển từ kiến trúc JavaCard, EmbededJava PersonalJava phiên Java 1.1 Đến dự đời phiên Java Sun định thay PersonalJava phiên có tên Java Micro Edition, viết tắt J2MEJ2ME sử dụng cho thiếtbị nhỏ gọn với dung lượng nhớ bé khả xử lý thấp Mục tiêu Java cho phép người lậptrình viết ứng dụng độc lập với thiếtbịdi động, không cần quan tâm đến phần cứng thật Để làm thế, J2ME xây dựng tầng khác để che giấu việc tương tác trực tiếp với phần cứng thiếtbị Các tầng cảu J2ME xây dựng CLDC (Connected Limited Device Configuration): Tầng tầng Phần cứng thiếtbị - tầng vật lý bao gồm phần cứng thiếtbịdiđộng Các tầng bên tầng Phần cứng thiếtbị tầng trừu tượng, chúng cung câp cho lậptrình viên nhiều giao diện lậptrình thân thiện dễ dàng mà không cần quan tâm đến phần cứng Nói khác chúng đóng vai trò trung gian giúp cho lậptrình viên tương tác với phần Footer Page of 113 Header Page of 113 cứng mà không cần quan tâm đến chi tiết thực phần cứng thiếtbị Tầng Phần cứng thiếtbị (Device Hardware Layer): thiếtbịdiđộng thật với nhớ tốc độ xử lý cụ thể Các thiếtbịdiđộng khác có vi xử lý tập lệnh khác Mục tiêu J2ME cung cấp cho lậptrình viên khả giao tiếp giống với tất loại thiếtbịdiđộng khác Tầng máy ảo Java (Java Virtual Machine Layer): tầng đóng vai trò thông ngôn chương trìnhthiếtbị Nó thông dịch mã bytecode (mã có sau biên dịch mã nguồn chương trình) thành mã máy thiếtbịdiđộng Tầng bao gồm KVM (K Virtual Machine) biên dịch mã bytecode thành mã máy Nó cung cấp chuẩn hóa cho thiếtbịdiđộngđể ứng dụng J2ME sau biên dịch chạy thiếtbịdiđộng hỗ trợ KVM Tầng cấu hình (Configuration Layer): Tầng cung cấp hàm API nhân J2MELậptrình viên sử dụng lớp phương thức API nhiên không thực phong phú tập API tầng trạng Tầng trạng (Profile Layer): Tầng cung cấp hàm API hữu dụng cho việc lậptrình Mục đích tầng xây dựng nên lớp cấu hình cung cấp nhiều thư viện ứng dụng 6.1 Lý chọn J2ME: Java ban đầu thiết kế dành cho máy với tài nguyên nhớ hạn chế Thị trường J2ME mở rộng cho nhiều chủng loại thiếtbị như: Các lọai thẻ cá nhân Java Card Máy điện thoại diđộng Máy PDA (Personal Digital Assistant - thiếtbị trợ giúp cá nhân) Các hộp điều khiển dành cho tivi, thiếtbị giải trí gia dụng … Footer Page of 113 Header Page of 113 6.2 Kiến trúc J2ME Phần trình bày kiến trúc tổng quát tảng Java a) Giới thiệu thành phần tảng J2ME: Định nghĩa Configuration (Cấu hình): đặc tảđịnh nghĩa môi trường phần mềm cho dòngthiết bịđược phân loại tập hợp đặc tính, ví dụ như: Kiểu số lượng nhớ Kiểu tốc độ vi xử lý Kiểu mạng kết nối Do đặc tả nên nhà sản xuất thiếtbị Samsung, Nokia …bắt buộc phải thực thi đầy đủ đặc tả Sun qui định đểlậptrình viên dựa vào môi trường lậptrình quán thông qua quán này, ứng dụng tạo mang tính độc lậpthiết bịcao Ví dụ lậptrình viên viết chương trình game cho điện thoại Samsung sửa đổi chương trình cách tối thiểu để chạy điện thọai Nokia Hiện Sun đưa dạng Configuration: CLDC (Connected Limited Device Configuration-Cấu hình thiếtbị kết nối giới hạn): thiết kếđể nhắm vào thị trường thiếtbị cấp thấp (low-end), thiếtbị thông thường máy điện thọai diđộng PDA với khoảng 512 KB nhớ Vì tài nguyên nhớ hạn chế nên CLDC gắn với Java không dây (Java Footer Page of 113 Header Page of 113 Wireless ), dạng cho phép người sử dụng mua tải ứng dụng Java, ví dụ Midlet CDC- Connected Device Configuration (Cấu hình thiếtbị kết nối): CDC đưa nhắm đến thiếtbị có tính mạnh dòngthiếtbị thuộc CLDC yếu hệ thống máy để bàn sử dụng J2SE Những thiếtbị có nhiều nhớ (thông thường 2Mb) có xử lý mạnh Các sản phẩm kểđến máy PDA cấp cao, điện thoại web, thiếtbị gia dụng gia đình … Cả dạng Cấu hình kể chứa máy ảo Java (Java Virtual Machine) tập hợp lớp (class) Java để cung cấp môi trường cho ứng dụng J2ME Tuy nhiên, bạn ý thiếtbị cấp thấp, hạn chế tài nguyên nhớ xử lý nên yêu cầu máy ảo hổ trợ tất tính với máy ảo J2SE, ví dụ, thiếtbị thuộc CLDC phần cứng yêu cầu phép tính toán dấu phẩy động, nên máy ảo thuộc CLDC không yêu cầu hỗ trợ kiểu float double Bảng so sánh thông số kỹ thuật CDC CLDC Footer Page of 113 Header Page 10 of 113 CLDC CDC Ram >=32K, =256K Rom >=128k, =512k Nguồn Năng Có GiớI Hạn (nguồn Không Lượng pin) hạn Network Chậm Nhanh giới b) Định nghĩa Profile: Profile mở rộng Configuration cách thêm vào class để bổ trợ tính cho thiếtbị chuyên biệt Cả Configuration có profile liên quan từ profile dùng class lẫn Đến ta nhận thấy profile định nghĩa tập hợp class khác nhau, nên thường ta chuyển ứng dụng Java viết cho profile chạy máy hỗ trợ profile khác Cũng với lý đó, bạn lấy ứng dụng viết J2SE hay J2EE chạy máy hỗtrợ J2ME Sau profile tiêu biểu: Mobile Information Device Profile (MIDP): profile bổ sung tính hỗtrợ kết nối, thành phần hỗ trợ giao diện người dùng … vào CLDC Profile thiết kế chủ yếu để nhắm vào điện thọai diđộng với đặc tính hình hiển thị hạn chế, dung lượng chứa có hạn Do MIDP cung cấp giao diện người dùng đơn giản tính mạng đơn giản dựa HTTP Có thể nói MIDP profile tiếng kiến thức cho lậptrình Java máy diđộng (Wireless Java) PDA Profile: tương tự MIDP, với thị trường máy PDA với hình bộnhớ lớn Foundation Profile: cho phép mở rộng tính CDC với phần lớn thư viện Core Java2 1.3 Ngoài có Personal Basis Profile, Personal Profile, RMI Profile, Game Profile Footer Page 10 of 113 10 Header Page 91 of 113 } } public void db(String str) { System.err.println("Msg: " + str); } } class TestRecordListener implements RecordListener { public void recordAdded(RecordStore recordStore, int recordId) { try { System.out.println("Record with ID#: " + recordId + "added to RecordStore: " + recordStore.getName()); } catch (Exception e) { System.err.println(e); } } public void recordDeleted(RecordStore recordStore, int recordId) { try { System.out.println("Record with ID#: " + recordId + "deleted from RecordStore: " + recordStore.getName()); } catch (Exception e) { System.err.println(e); } } public void recordChanged(RecordStore recordStore, int recordId) { try{ System.out.println("Record with ID#: " + recordId + "changed in RecordStore: " recordStore.getName()); } catch (Exception e) { System.err.println(e); } } } Footer Page 91 of 113 91 Header Page 92 of 113 Các Ngoại Lệ Phát Sinh Trong RMS Các phương thức API RMS việc phát sinh ngoại lệ thông thường đến môi trường chạy (runtime enviroment) RMS định nghĩa thêm ngoại lệ gói javax.microedition.rms sau: InvalidRecordIDException: Ngoại lệ phát sinh thao tác Record RecordID không thích hợp RecordStoreFullException: Ngoại lệ phát sinh không đủ vùng nhớ RecordStoreNotFoundException: Ngoại lệ phát sinh mở RecordStore không tồn RecordStoreNotOpenException: Ngoại lệ phát sinh thao tác RecordStore bịđóng RecordStoreException: Đây lớp cha lớp trên, ngoại lệ mô tả lỗi chung trình thao tác với RMS Footer Page 92 of 113 92 Header Page 93 of 113 Chương IV: KHUNG KẾT NỐI CHUNG (Generic Connection Framework - GCF) Trong phiên J2SE, hỗ trợ giao thức kết nối mạng có gói java.io java.net với tổng dung lượng 200KB bao gồm 100 lớp giao diện Qaủ thật với nhớ nhỏ bé hạn chế xử lý, việc đưa gói vào ứng dụng viết J2ME điều hoàn toàn không khả thi Chính vậy, mở rộng phạm vi hỗ trợ giao thức mạng hệ thống tập tin, ngưoiừ ta không dùng lại lớp J2SE mà xây dựng khái niệm gọi Khung kết nối chung (Generic Connection Framework - GCF) GCF tập hợp lớp giao diện thiết kế nhằm tọa thuận tiện cho việc truy xuất đến hệ thống lưu trữ kết nối mạng Mục tiêu GCF tạo tập lớp hoàn toàn mà cung cấp tập J2SE cách có chọn lọc Tập giới hạn tối ưu để phù hợp với ràng buộc khác biệt thiếtbịdiđộng Cây phân cấp Connection Khi đưa khái niệm phân cấp, người ta chủ ý tạo lớp có khả mở loại kết nối bao gồm: file, http, datagram, … Tên lớp Connector Như sử dụng Connector để mở kết nối, cần gọi phương thức open có định dạng sau: Connector.Open(“protocol:address; parameter”) Cơ chế mà GCF dùng để mở nhiều loại giao tiếp phương thức chung chứng minh tính uyển chuyển GCF Cơ chế hoạt động sau: Trong thời gian thực thi, có yêu cầu mở giao thức, Connector tìm đến lớp tương ứng cài đặt giao thức Quá trình tìm kiếm thực thông qua phương thức Class.forName() Ví dụ để yêu cầu mở kết nối HTTP J2ME, yêu cầu viết sau: Footer Page 93 of 113 93 Header Page 94 of 113 Class.forName(“com.sun.midp.io.j2me.http.Protocol”); Khi tìm thấy lớp tương ứng, Class.forName() trả đối tượng có cài đặt giao diện Connection (trong lớp Connector giao diện Connection định nghĩa sẵn CLDC) Sau phân cấp Connection, bao gồm lớp mà lớp định nghĩa giao diện Trong kiến trúc phân cấp, cài đặt thật ác giao thức nằm mức trạng Trong MIDP 1.0, HttpConnection hỗ trựo tâpj HTTP phiên 1.0 Do lớp mở rộng ContentConnection, cung cấp sẵn 20 phương thức chuyên biệt để giao tiếp thông qua giao thức HTTP Mặc dù DatagramConnection xuất phân cấp người ta không bắt buộc cài đặt MIDP để hỗ trợ giao thức Footer Page 94 of 113 94 Header Page 95 of 113 Kết nối HTTP HTTP giao thức chắn hỗ trợ MIDP 1.0 Chúng ta giao tiếp với máy chủ hay thiếtbị từ xa có hỗ trợ giao thức nhờ vào lớp HttpConnection Lớp Connector cung cấp cho người dùng bảy phương thức để tạo kết nối tới máy chủ Ba phương thức số biến thể phương thức open() Các phương thức mô tả bảng sau: Các phương thức lớp javax.microedition.io.Connector Phương thức Mô tả static Connection open(String Tạo kết nối có chế độ name) READ_WRITE static Connection open(String name, Tạo kết nối với chế độ int mode) static Connection open(String name, int mode, boolean timeouts) static InputStream openInputStream(String name) static OutputStream openOutputStream(String name) định Tạo kết nối với chế độ định, thêm ngoại lệ time out Tạo kết nối luồng nhập Tạo kết nối luồng xuất static DataInputStream Tạo kết nối luồng nhập kiểu openDataInputStream(String name) DataInputStream static DataOutputStream openDataOutputStream(String name) Footer Page 95 of 113 Tạo kết nối luồng xuất kiểu DataOutputStream 95 Header Page 96 of 113 Dưới đoạn code mở kết nối thông qua stream // Create a ContentConnection String url = “http://www.corej2me.com”; ContentConnection connection = (ContentConnection) Connector.open(url); // With the connection, open a stream InputStream iStrm = connection.openInputStream(); // ContentConnection includes a length method int length = (int) connection.getLength(); if (length != -1) { byte imageData[] = new byte[length]; // Read the data into an array iStrm.read(imageData); } Thật tọa kết nối InputStream mà không cần có mặt ContentConnection Tuy nhiên, phương pháp có hạn chế không cung cấp phương thức để xác định chiều dài liệu Dưới cách mở kết nối dạng HttpConnection: String url = “http://www.corej2me.com/midbook_v1e1/ch14/duke.png”; HttpConnection http = (HttpConnection) Connector.open(url); Sau mở, kết nối cung cấp truy xuất đến nhiều loại luồng mà InputStream DataInputStream hai số Tuy nhiên mạnh thực kết nối HttpConnection lại nằm chỗ có khả giúp cho lậptrình viên loại bỏ gánh nặng câu lệnh HTTP Dưới ví dụ đơn giản, MIDlet download hiển thị hình ảnh tải MIDlet dử dụng ByteArrayOutputStream để chứa liệu tải ta không dùng ContentConnection nên biết kích cỡ liệu tải Footer Page 96 of 113 96 Header Page 97 of 113 /* -* DownloadImage.java * */ import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.io.*; import java.io.*; public class DownloadImage extends MIDlet implements CommandListener { private Display display; private TextBox tbMain; private Form fmViewPng; private Command cmExit; private Command cmView; private Command cmBack; public DownloadImage() { display = Display.getDisplay(this); // Create the textbox, allow maximum of 50 characters tbMain = new TextBox("Enter url", "http://localhost/intel.png", 55, 0); // Create commands and add to textbox cmExit = new Command("Exit", Command.EXIT, 1); cmView = new Command("View", Command.SCREEN, 2); tbMain.addCommand(cmExit); tbMain.addCommand(cmView ); // Set up a listener for textbox tbMain.setCommandListener(this); // Create the form that will hold the image fmViewPng = new Form(""); // Create commands and add to form cmBack = new Command("Back", Command.BACK, 1); fmViewPng.addCommand(cmBack); // Set up a listener for form fmViewPng.setCommandListener(this); } public void startApp() { display.setCurrent(tbMain); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction(Command c, Displayable s) { Footer Page 97 of 113 97 Header Page 98 of 113 // If the Command button pressed was "Exit" if (c == cmExit) { destroyApp(false); notifyDestroyed(); } else if (c == cmView) { // Download image and place on the form try { Image im; if ((im = getImage(tbMain.getString())) != null) { ImageItem ii = new ImageItem(null, im, ImageItem.LAYOUT_DEFAULT, null); // If there is already an image, set (replace) it if (fmViewPng.size() != 0) fmViewPng.set(0, ii); else // Append the image to the empty form fmViewPng.append(ii); } else fmViewPng.append("Unsuccessful download."); // Display the form with image display.setCurrent(fmViewPng); } catch (Exception e) { System.err.println("Msg: " + e.toString()); } } else if (c == cmBack) { display.setCurrent(tbMain); } } private Image getImage(String url) throws IOException { InputStream iStrm = (InputStream) Connector.openInputStream(url); Image im = null; try { ByteArrayOutputStream bStrm = new ByteArrayOutputStream(); int ch; while ((ch = iStrm.read()) != -1) bStrm.write(ch); // Place into image array byte imageData[] = bStrm.toByteArray(); // Create the image from the byte array im = Image.createImage(imageData, 0, imageData.length); } Footer Page 98 of 113 98 Header Page 99 of 113 finally { // Clean up if (iStrm != null) iStrm.close(); } return (im == null ? null : im); } } Một textbox cho phép nhập địa URL Sau tải về, hình ảnh sẽđược hiển thị Footer Page 99 of 113 99 Header Page 100 of 113 Client Request Server Response Cả HTTP HTTPS gửi request response Máy client gửi request, server trả response Client request bao gồm phần sau: Request method Header Body Request method định nghĩa cách mà liệu gửi đến server Có phương thức cung cấp sẵn GET, POST, HEADER Khi sử dụng Get, liệu cần request nằm URL Với Post liệu gửi từ client sẽđược phân thành stream riêng biệt Trong đó, Header không gửi liệu yêu cầu lên server, thay vào header request meta information server GET POST hai phương thức request giống nhau, nhiên GET gửi liệu thông qua URL nên bị giới hạn, POST sử dụng stream riêng biệt nên khắc phục hạn chế Ví dụ việc mở HTTP Connection thông qua GET String url = "http://www.corej2me.com?size=large"; HttpConnection http = null; http = (HttpConnection) Connector.open(url); http.setRequestMethod(HttpConnection.GET); Những Header field cho phép ta truyền tham số từ client đến server Các header field thường dùng If-Modified-Since, Accept, and User Agent Bạn có thểđặt field thông qua phương thức setRequestProperty() Dưới ví dụ dùng setRequestProperty(), có liệu thay đổi sau ngày tháng năm 2005 gửi từ server: String url = "http://www.corej2me.com\somefile.txt"; HttpConnection http = null; http = (HttpConnection) Connector.open(url); http.setRequestMethod(HttpConnection.GET); // Set header field as key-value pair Footer Page 100 of 113 100 Header Page 101 of 113 http.setRequestProperty("If-Modified-Since", "Sat, Jan 2005 12:00:00 GMT"); Body chứa nội dung mà bạn muốn gửi lên server Ví dụ sử dụng POST gửi liệu từclient thông qua stream: String url = “http://www.corej2me.com”; tmp = "test data here"; OutputStream ostrm = null; HttpConnection http = null; http = (HttpConnection) Connector.open(url); http.setRequestMethod(HttpConnection.POST); // Send client body ostrm = http.openOutputStream(); byte bytes[] = tmp.getBytes(); for(int i = 0; i < bytes.length; i++) { os.write(bytes[i]); } os.flush(); Sau nhận sử lý yêu cầu từ phía client, server đóng gói gửi phía client Cũng client request, server gồm phần sau: Status line Header Body Status line thông báo cho client kết request mà client gửi cho server HTTP phân loại status line thành nhóm sau đây: 1xx is informational 2xx is success 3xx is redirection 4xx is client error 5xx is server error Status line bao gồm version HTTP server, status code, đoạn text đại diện cho status code Ví dụ: "HTTP/1.1 200 OK" "HTTP/1.1 400 Bad Request" "HTTP/1.1 500 Internal Server Error" Footer Page 101 of 113 101 Header Page 102 of 113 Header Không giống header client, server gửi data thông qua header Sau phương thức dùng để lấy thông tin Header mà server gửi về: String getHeaderField(int n) Get header field value looking up by index String getHeaderField(String name) Get header field value looking up by name String getHeaderFieldKey(int n) Get header field key using index Server trả nhiều Header field Trong trường hợp này, phương thức cho lấy header field thông qua index Còn phương thức thứ hai lấy nội dung header field dựa vào tên header field Còn muốn biết tên (key) header field, dùng phương thức thứ Sau ví dụ phương thức trên, trường hợp server gửi chuỗi "content-type=text/plain" Method Return value http.getHeaderField(0) "text-plain" http.getHeaderField("content- "text-plain" type") http.getHeaderFieldKey(0) "content-type" Body: Cũng giống client, server gửi hầu hết thông tin phần body cho client Client dùng input stream đểđọc kết trả từ server The HttpConnection API Như đề cập trên, ta sử dụng HttpConnection API đểthiếtlập kết nối MIDP Dưới API HttpConnection: Method Description long getDate() Get header field date long getExpiration() Gets header field expiration Footer Page 102 of 113 102 Header Page 103 of 113 String getFile() Gets filename from the URL int getHeaderField(int n) Gets header field value looking up by index String getHeaderField(String name) Gets header field value looking up by name long getHeaderFieldDate(String Gets named field as a long (representing the name, long def) date) int getHeaderFieldInt(String name, int def) Gets named field as an integer String getHeaderFieldKey(int n) Gets header field key using index String getHost() Gets host from the URL long getLastModified() Gets last-modified field value String getPort() Gets port from the URL String getProtocol() Gets protocol from the URL String getQuery() String getRef() String getRequestMethod() Gets the query string (only valid with GET request) Gets the reference portion of URL Gets the current setting of the request method (GET, POST or HEAD) String getRequestProperty(String Gets the current setting of a request key) property int getResponseCode() Gets the response code (numeric value) String getResponseMessage() Gets the response message (text value) String getURL() Gets the entire URL void setRequestMethod(String Sets the request method (GET, POST or method) HEAD) void setRequestProperty(String key, Sets a request property (header information) String value) Footer Page 103 of 113 103 Header Page 104 of 113 Chương V: TỔNG KẾT Hiện nay, lậptrình điện thoại diđộng lĩnh vực thu hút nhiều lậptrình viên Việc xây dựng ứng dụng thiếtbịthiếtbị nói chung điện thoại diđộng nói riêng cần thiết phát triển công nghệ diđộng Trong phạm vi đề tài, em trình bày phần công nghệ J2ME kỹ thuật lậptrình cho điện thoại diđộng Những phần nghiên cứu, tìm hiểu qua trình học tập làm việc Hi vọng đềtài trở thành công cụ tham khảo có ích cho người tham gia tìm hiểu công nghệ J2ME Tuy vậy, hạn chế trình độ thiếtbị nên em tránh khỏi vướng mắc sai sót trình tìm hiểu, nghiên cứu Em mong đánh giá chỉnh sửa thầy hướng dẫn bạn sinh viên đọc qua tài liệu Em xin chân thành cảm ơn Hà nội, ngày 26/11/2007 Bùi Duy Thành Footer Page 104 of 113 104 Header Page 105 of 113 Tài liệu tham khảo [1] Phương Lan, Java tập 3, NXB Lao động Xã hội, 2006 [2] Nguyễn Thị Bích Ngà, Nền tảng công nghệ J2Me & MDP, NXB Giao thông Vận tải, 2006 [3] Nguyễn Hữu Mai, Tổng quan J2ME, javavietnam.org, 2004 [4] Lê Ngọc Quốc Khánh, Phát triển ứng dụng J2MEJ2ME Wireless Toolkit, 2004 [5] John W Muchow, Core J2METM Technology & MIDP, Prentice Hall PTR publisher, 2001 [6] Kim Topley, J2Me in a Nutshell, O’Reilly publisher, 2002 [7] Gwenaël Le Bodic, Mobile Messaging Technologies and Service, John Wiley & Sons publisher, 2003 Footer Page 105 of 113 105 ... of 113 6.9 Những khó khăn lập trình thiết bị di động Sử dụng công nghệ J2ME cho việc lập trình thiết bị di động việc không khó lập trình viên Tuy lập trình J2ME, lập trình viên gặp phải số khó... Do đủ thiết bị để nghiên cứu nên em trình bày kỹ thuật lập trình điện thoại di động thiết bị di động khác nói chung Do đề tài này, cụm từ thiết bị di động hiểu theo nghĩa “điện thoại di động ... điện thoại di động dựa công nghệ WAP SOAP Em chọn đề tài Lập trình thiết bị di động J2ME viết số ứng dụng đơn giản nhằm khai thác tính thiết bị di động mà chủ yếu điện thoại di động Qua em