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,56 MB
Nội dung
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 J2ME lập trì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ập trì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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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ịn 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ì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 cố gắng nắm bắt ứng dụng tốt kỹ thuật lập trình thiết bị 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ập trình thiết bị 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,… LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Đối tượng nghiên cứu Hiểu chi tiết J2ME ứng dụng để lập trình thiết bị di động Nắm kỹ thuật xử lý âm thanh, hình ảnh, lưu trữ liệu thiết bị di động Ứng dụng kết có để xây dựng ứng dụng thực tiễn thiết bị 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ập trình phân tán thiết bị di động Đây ý tưởng chưa áp dụng cho thiết bị di động Phạm vi nghiên cứu Nghiên cứu chi tiết công nghệ J2ME kỹ thuật lập trì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 cịn nhiều hạn chế nên em trình bày kỹ thuật lập trì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 khơng có đủ 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” 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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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ập trình viên giới Ban đầu, Oak kỹ sư James Gosling cộng xây dựng với mục đích lập trì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ết bị 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ết bị 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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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ết bị có nhớ nhỏ điện thoại di động, PDA, đồ gia dụng,… Giới thiệu J2ME lập trình cho thiết bị di động J2ME 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 J2ME J2ME sử dụng cho thiết bị 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ập trình viết ứng dụng độc lập với thiết bị 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ết bị 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ết bị - tầng vật lý bao gồm phần cứng thiết bị di động Các tầng bên tầng Phần cứng thiết bị tầng trừu tượng, chúng cung câp cho lập trình viên nhiều giao diện lập trì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ập trình viên tương tác với phần LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com cứng mà không cần quan tâm đến chi tiết thực phần cứng thiết bị Tầng Phần cứng thiết bị (Device Hardware Layer): thiết bị di động thật với nhớ tốc độ xử lý cụ thể Các thiết bị di động khác có vi xử lý tập lệnh khác Mục tiêu J2ME cung cấp cho lập trình viên khả giao tiếp giống với tất loại thiết bị 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ình thiết bị 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ết bị 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ết bị di động để ứng dụng J2ME sau biên dịch chạy thiết bị di động hỗ trợ KVM Tầng cấu hình (Configuration Layer): Tầng cung cấp hàm API nhân J2ME Lập trì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ập trì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ết bị 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ết bị trợ giúp cá nhân) Các hộp điều khiển dành cho tivi, thiết bị giải trí gia dụng … LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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ịng thiế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ết bị Samsung, Nokia …bắt buộc phải thực thi đầy đủ đặc tả Sun qui định để lập trình viên dựa vào mơi trường lập trình qn thơng qua quán này, ứng dụng tạo mang tính độc lập thiết bịcao Ví dụ lập trì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ết bị kết nối giới hạn): thiết kếđể nhắm vào thị trường thiết bị cấp thấp (low-end), thiết bị 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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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ết bị kết nối): CDC đưa nhắm đến thiết bị có tính mạnh dòng thiết bị thuộc CLDC yếu hệ thống máy để bàn sử dụng J2SE Những thiết bị 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ết bị 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ết bị 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ết bị thuộc CLDC khơng có phần cứng u cầu phép tính tố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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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ết bị 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 khơng thể 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ập trì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 Ngồi cịn có Personal Basis Profile, Personal Profile, RMI Profile, Game Profile 10 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com } } 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); } } } 91 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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 khơng thể thao tác Record RecordID khơng thích hợp RecordStoreFullException: Ngoại lệ phát sinh khơng cịn đủ 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 92 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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 hồn tồ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 hồn tồ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ết bị 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: 93 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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 94 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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ết bị 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) Tạo kết nối luồng xuất kiểu DataOutputStream 95 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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ập trì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 khơng thể biết kích cỡ liệu tải 96 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com /* -* 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) { 97 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com // 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); } 98 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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ị 99 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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 100 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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" 101 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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ết lập kết nối MIDP Dưới API HttpConnection: Method Description long getDate() Get header field date long getExpiration() Gets header field expiration 102 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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) 103 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Chương V: TỔNG KẾT Hiện nay, lập trình điện thoại di động lĩnh vực thu hút nhiều lập trình viên Việc xây dựng ứng dụng thiết bị thiết bị 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ập trì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ết bị nên em tránh khỏi vướng mắc sai sót q 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 104 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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 J2ME J2ME 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 105 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com ... luanvanchat@agmail.com 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ó... điện thoại di động họ Do khơng có đủ 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... Layer): thiết bị di động thật với nhớ tốc độ xử lý cụ thể Các thiết bị di động khác có vi xử lý tập lệnh khác Mục tiêu J2ME cung cấp cho lập trình viên khả giao tiếp giống với tất loại thiết bị di động