Trường Đại Học Giao Thông Vận Tải TP.HCMKhoa Công Nghệ Thông Tin. BÁO CÁO ĐỀ TÀIMôn học: Lập Trình Mạng.GVHD: Thầy Đặng Tư Cách Thành viên nhóm:1.Võ Huỳnh Lê Vũ.2.Dương Ngọc Thiện3.Nguyễn Hữu Tình4.Lý Quang Thiện5.Nguyễn Văn ThơmTP.HCM ngày 15 tháng 12 năm 2010
Trang 1Trường Đại Học Giao Thông Vận Tải TP.HCM
Khoa Công Nghệ Thông Tin.
Trang 2MỤC LỤC
I Giới thiệu: 3
II Cơ sở lý thuyết 3
1 Giới thiệu về J2ME: 3
1.1 Tổng quan: 3
1.2 Kiến trúc của J2ME: 4
2 Các gói đã sử dụng: 9
2.1 javax.microedition.io.Connecton: 9
2.2 javax.microedition.io.SocketConnection 11
2.3 javax.microedition.io.HttpConnection 13
2.4 com.google.api.javame 16
2.5 Các gói I/O liên quan: 17
III Hiện thực chương trình: 20
IV Hướng dẫn cài đặt và sử dụng: 22
1 Cài đặt: 22
2 Hướng dẩn sử dụng: 22
2.1 Dịch văn bản 22
2.2.Hướng dẫn cấu hình chương trình: 23
VI Kiểm tra- đánh giá: 24
Trang 3Trên điện thoại di động thì JAVA rất phổ biến hầu như điện thoại nào cũng hỗ trợ, vì thế, chương trình sẽ sử dụng JAVA cụ thể là JAVA2ME Chương trình có thể dịch thông qua kết nối Socket hoặc Http, thông qua 1 server khác hoặc kết nối trực tiếp đến Google Translate để dịch.
Trang 4II Cơ sở lý thuyết
1 Giới thiệu về J2ME:
- Profile: là tầng trên của Configuration, Profile mở rộng Configuration bằng cách thêm
các class để hỗ trợ cho các thiết bị với các tính năng chuyên biệt Profile được sử dụng trong J2ME là MIDP (Mobile Information Device Profile)
Trang 5Hạn chế của MIDP:
+ Không hỗ trợ phép tính với dấu phầy động: phép tính này đòi hỏi tài nguyên hệ
thống vượt quá sự cho phép của các thiết bị dùng J2ME
+ Hỗ trợ hạn chế thao tác bắt lỗi
+ Không hỗ trợ các tính năng quản lý file và thư mục
Những tính năng chính của MIDP 1.0:
+ Các lớp và kiểu dữ liệu: các thư viện thông dụng vẫn được giữ lại để hỗ trợ người lập trình
+ Hỗ trợ Form và giao diện người dùng
+ Hỗ trợ Time và Alert
+ Tính năng RMS cho phép lưu trữ dữ liệu
+ Hỗ trợ đối tượng Display
MIDP 2.0 ra đời cũng đã hỗ trợ nhiều tính năng mới:
+ Nâng cấp khả năng bảo mật (hỗ trợ https)
+ Thêm cácAPI hỗ trợ Multimedia
+ Hỗ trợ game nhiều hơn
+ Hỗ trợ kiểu ảnh RGB
- Java Virtual Machine: J2ME dùng một máy ảo Java riêng biệt với tên gọi (KVM)
KVM là một sự rút gọn của JVM để thích hợp với các thiết bị có sự hạn chế về cấu hình Chính vì điều đó, những thiết bị nhỏ gọn chỉ hỗ trợ J2ME thì không thế chạy các ứng dụng đươc viết trên môi trường Java thuần túy được
1.2.2 Môi trường phát triển:
Có nhiều bộ công cụ hỗ trợ lập trình J2ME
Trang 7+ Listbox.
+ Choicegroup
+ Datefield
Trang 8+ CustomItem.
+ ImageItem
+ Ticker:
Trang 92 Các gói đã sử dụng:
2.1 javax.microedition.io.Connecton:
Mạng cho phép client di động gởi và nhận dữ liệu đến server Nó cho phép thiết bị di động
sử dụng các ứng dụng như tìm kiếm cơ sở dữ liệu, trò chơi trực tuyến… Trong J2ME, mạng được chia làm hai phần Phần đầu tiên là khung được cung cấp bởi CLDC và phần hai là các giao thức thật sự được định nghĩa trong các hiện trạng
Khung mạng CLDC tổng quát (Generic CLDC Networking Framework)
CLDC cung cấp một khung tổng quát để thiết lập kết nối mạng Ý tưởng là nó là đưa ra một khung mà các hiện trạng khác nhau sẽ sử dụng Khung CLDC không định nghĩa giao thức thật sự Các giao thức sẽ được định nghĩa trong các hiện trạng Hình 1 biểu diễn cách mà khung CLDC làm việc:
Khung mạng CLDC tổng quát
Kết nối mạng được xây dựng bằng phương thức open() của lớp Connector trong CLDC Phương thức open() nhận một tham số đầu vào là chuỗi Chuỗi này dùng để xác định giao thức Định dạng của chuỗi là:
protocol:address;parameters
CLDC chỉ xác định tham số là một chuỗi nhưng nó không định nghĩa bất kỳ giao thức thật sựnào Các hiện trạng có thể định nghĩa các giao thức kết nối như HTTP, socket, cổng truyền
Trang 10thông, datagram,… Phương thức open() trả về một đối tượng Connector Đối tượng này sau
đó có thể đóng vai trò là một giao thức xác định được định nghĩa trong hiện trạng
Connector.open(“protocol : address; parameters”);
Một số giao thức ví dụ (nhưng không được hỗ trợ bởi CLDC hay MIDP):
Trả về một đối tượng Connection
Ví dụ trên minh họa kết nối socket, cổng truyền thông, datagram, file và HTTP Tất cả các kết nối mạng đều có cùng định dạng, không quan tâm đến giao thức thật sự Nó chỉ khác nhau ở chuỗi chuyển cho phương thức open() Phương thức open() sẽ trả về một đối tượng Connection đóng vai trò là lớp giao thức (ví dụ HttpConnection) để có thể sử dụng các phương thức cho giao thức đó J2ME chỉ định nghĩa một kết nối là kết nối HTTP trong MIDP
Các lớp giao diện kết nối:
Dẫn xuất từ lớp Connection là nhiều lớp giao diện con cung cấp khung kết nối mạng Các giao diện khác nhau để hỗ trợ các loại thiết bị di động khác nhau
Trang 112.2 javax.microedition.io.SocketConnection
Khái quát về Socket :Như chúng ta đã biết kết nối URLs và URL cung cấp cho chúng ta một
cơ cấu để truy xuất vào các tài nguyên trên Internet ở một mức tương đối cao, nhưng đôi khi chương trình của chúng ta lại yêu cầu một giao tiếp ở tầng mạng mức thấp Ví dụ khi chúng taviết một ứng dụng client- server.Trong một ứng dụng client-server thì phía server sẽ cung cấp một số dịch vụ, như: xử lí cơ sở dữ liệu, các yêu cầu bên phía client đưa ra, sau đó sẽ gửi lại cho phía client Sự giao tiếp như vậy gọi là tin cậy bởi vì dữ liệu sẽ không bị mất mát, sai lệch trong quá trình truyền, server gửi cho client thông điệp gì thì phía client sẽ nhận được thông điệp nguyên như vậy Giao thức TCP sẽ cung cấp cho chúng ta một cách thức truyền tin cậy Để có thể nói chuyện được trên TCP thì chương trình client và chương trình server phải thiếp lập một đường truyền, và mỗi chương trình sẽ phải kết nối lại với socket là điểm cuối để kết nối, client và server muốn nói chuyện với nhau thì sẽ phải thông
qua socket, mọi thông điệp sẽ phải đi qua socket Chúng ta cứ mường tượng socket ở đây là một cái cửa mọi người muốn đi ra hay đi vào đều phải thông qua cái cửa này
Socket là gì?
Một socket là một điểm cuối của thông tin hai chiều liên kết giữa hai chương trình đang chạytrên mạng Những lớp socket được dùng để đại diện cho kết nối giữa một chương trình client
và một chương trình server Trong Java gói Java.net cung cấp hai lớp Socket và
ServerSocket để thực hiện kết nối giữa client và server
Thông thường thì server sẽ chạy trên một máy đặc biệt và có một socket giới hạn trong một Port number đặc biệt Phía client: client được biếthostname của máy mà server đang chạy và port number mà server đang lắng nghe Để tạo một yêu cầu kết nối client sẽ thử hẹn gặp
Trang 12server ở trên máy của server thông qua port number Client cũng cần xác định chính nó với server thông qua local port number
Nếu mọi thứ tốt đẹp thì server sẽ đồng ý kết nối khi đồng ý kết nối thì server sẽ tạo ra một socket mới để nói chuyện với client và cũng tạo ra một socket khác để tiếp tục lắng nghe
Sử dụng Socket trong J2ME:
Đoạn code sau sẽ thiết lập 1 kết nối để lắng nghe 1 kết nối Socket
Trang 13dữ liệu được truyền tới.
Đoạn code tiếp theo cho phép client khởi tạo 1 kết nối Socket đến kết nối trên
Hiện trạng MIDP hỗ trợ kết nối HTTP phiên bản 1.1 thông qua giao diện HttpConnection
Hỗ trợ GET, POST, HEAD của HTTP Yêu cầu GET (GET request) được dùng để lấy dữ liệu từ server và đây là phương thức mặc định Yêu cầu POST dùng để gởi dữ liệu đến server Yêu cầu HEAD tương tự như GET nhưng không có dữ liệu trả về từ server Nó có thể
Trang 14dùng để kiểm tra tính hợp lệ của một địa chỉ URL.
Phương thức open() của lớp Connector dùng để mở kết nối Phương thức open() trả về một đối tượng Connection sau đó có thể đóng vai trò là một HttpConnection cho phép dùng tất cảcác phương thức của HttpConnection
Một kết nối HTTP có thể ở một trong ba trạng thái khác nhau: Thiết lập (Setup), Kết nối (Connectd), hay Đóng (Close) Trong trạng thái Thiết lập, kết nối chưa được tạo Phương thức setRequestMethod() và setRequestProperty() chỉ có thể được dùng trong trạng thái thiết lập Chúng được dùng để thiết lập phương thức yêu cầu (GET, POST, HEAD) và thiết lập thuộc tính HTTP (ví dụ User-Agent) Khi sử dụng một phương thức yêu cầu gởi dữ liệu đến hay nhận dữ liệu về từ server sẽ làm cho kết nối chuyển sang trạng thái Kết nối Gọi phương thức close() sẽ làm cho kết nối chuyển sang trạng thái Đóng Hình 3 minh họa các trạng thái kết nối khác nhau:
Ví dụ HTTP GET
Phương thức HTTP GET cho phép lấy dữ liệu từ server và là phương thức mặc định nếu không xác định phương thức trong trạng thái Thiết lập
Ví dụ thực hiện một kết nối HTTP GET cơ bản:
void getViaHttpConnection(String url) throws IOException
Trang 15int numBytes = is.read[data]; // Nếu biết chiều dàiprocessData(data);
} else {
int ch;
while ((ch = is.read()) != -1) { // đọc đến khi nào gặp -1stringBuffer.append((char)ch);
}processBuffer(stringBuffer);
Phương thức getLength() sẽ trả về chiều dài của dữ liệu gởi từ server Nếu biết được chiều dài, thì biến len sẽ chứa chiều dài dữ liệu và ta có thể đọc toàn bộ khối dữ liệu Nếu không thì len sẽ chứa giá trị -1 và dữ liệu phải được đọc từng ký tự một cho đến khi gặp đánh dấu cuối file (-1) Phương thức processData() và processBuffer() xử lý dữ liệu đến từ server Khối lệnh cuối cùng sẽ đóng tất
cả các kết nối không quan tâm đến có lỗi từ khối lệnh try ở trước hay không
Ví dụ HTTP POST
HTTP POST cho phép gởi dữ liệu đến server Dữ liệu gởi đến server qua phương thức GET chỉ giới hạn là dữ liệu chứa địa chỉ URL Phương thức POST cho phép gởi một luồng byte đến server Phương thức HTTP POST thực hiện theo cách tương tự với phương thức HTTP GET
Ví dụ thực hiện một kết nối HTTP POST:
void getViaHttpConnection(String url) throws IOException
Trang 16// trong khi vẫn ở trạng thái Thiết lập
os.write(“Data Sent to Server\n”.getBytes());
int status = c.getResponseCode();
// Kiểm tra status
if (status != HttpConnection.HTTP_OK) throw new IOException(“not OK”);
int len = (int)c.getLength();
// Giống như ví dụ HTTP GET:
// Kiểm tra length và xử lý tương ứng
} finally {
// Đóng kết nối giống như ví dụ HTTP GET
}
}
Như ví dụ trước, phương thức postViaHttpConnection() nhận tham số đầu vào là một chuỗi
là địa chỉ URL được chuyển đến phương thức open() của lớp Connection Phương thức open() trả về một đối tượng Connection đóng vai trò là một lớp HttpConnection
Kết nối bây giờ ở trong trạng thái thiết lập và phương thức yêu cầu được đặt là POST bằng phương thức setRequestMethod() Tất cả các thuộc tính khác phải được thiết lập trong trạng thái này
Phương thức openOutputStream() sẽ làm cho kết nối chuyển sang trạng thái Kết nối Phươngthức write() và flush() sẽ gởi dữ liệu đến server
Đoạn mã còn lại giống như phương thức GET Luồng input được mở, chiều dài của dữ liệu được kiểm tra, và dữ liệu được đọc toàn bộ khối hay từng ký tự một tùy vào chiều dài được trả về Khối lệnh cuối cùng sẽ đóng kết nối
Trang 17Trong đó "How are you" là chuỗi cần dịch, Language.ENGLISH là ngôn ngữ nguồn, Language.FRENCH là ngôn ngữ đích Các ngôn ngữ này được định nghĩa sẵn trong class Language Có hơn 40 ngôn ngữ được hỗ trợ.
2.5 Các gói I/O liên quan:
2.5.1 java.io.InputStream
InputStream cung cấp các phương thức để đọc dữ liệu từ các nguồn như là : file, kết nối mạng, hay từ bộ nhớ v.v
InputStream có 1 vài subclass được định nghĩa sẵn dựa trên nguồn dữ liệu mà ta muốn đọc
Example types of InputStream in the standard Java libraries.
Data source Type of input stream
( InputStream subclass) How to obtain
an entry in a zip file ZipFileInputStream(Internal class to ZipFile ) new ZipFile(f).getInputStream(entry)
a network socket SocketInputStream new Socket( ).getInputStream()
a network source referred to by URL Depends on the protocol new URL(url).openStream()
a byte array ByteArrayInputStream new ByteArrayInputStream(b)
InputStream cung cấp phương thức read() để có thể lấy được dữ liệu Dưới đây là 1 vài dạng của phương thức read()
Different read() methods provided by InputStream
The next unsigned byte in the file, as anint.
-1
a byte array Read bytes from the stream into the array, limited by availability and array size Number of bytes read into the array
a byte array, offset and
number of bytes to read
Read bytes from the stream into the array, starting at the given offset and limited by availability and number of bytes specified
Number of bytesread into the array
Trang 18Ví dụ dưới đây sẽ đọc các byte liên tục từ file.
import java.io.*;
File f = new File(dir, filename);
InputStream in = new FileInputStream(f);
Ngoài ra còn có một số phương thức sau:
• available trả về số lượng byte có thể được đọc từ inputStream này
• mark đánh dấu vị trí hiện tại trong input stream
• skip không đọc n byte dữ liệu từ input stream
• reset khởi động lại việc đọc từ vị trí trong phương thức mark
• …
2.5.2 java.io.OutputStream
Ngược lại với InputStream,OutputStream dùng để ghi dữ liệu
Trang 19OutputStream là lớp trừu tượng và cơ bản nhất để tất cả các lớp xử lý luồng xuất byte
kế thừa OutputStream có 3 phương thức chính là:
• write ghi những byte dữ liệu tới luồng xuất
• flush xả luồng để tất cả các vùng nhớ (buffer) của luồng trong trạng thái trống sẵn sàng choviệc ghi
• close đóng luồng xuất và giải phóng tất cả tài nguyên hệ thống liên quan đến luồng xuất này
ByteArrayOutputStream là một lớp kế thừa từ lớp OutputStream, nó được dùng để ghi dữ liệu trong một mảng byte, vùng nhớ (buffer) dữ liệu sẽ tự động tăng khi chúng ta ghi dữ liệu vào
Một số hàm căn bản của lớp này:
• toByteArray lấy dữ liệu từ stream trong một mảng byte
• toString lấy dữ liệu từ stream trong một chuỗi
• size lấy kích của buffer hiện tại trong stream
• reset chuyển buffer về trạng thái rỗng (count=0)
• writeTo ghi dữ liệu tới một stream khác
FileOutputStream là lớp kế thừa từ lớp OutputStream, được dùng để ghi dữ liệu tới tập tin.Dưới đây là 1 ví dụ về ghi dữ liệu với FileOutputStream
OutputStream output = new FileOutputStream("c:\\data\\output-text.txt");
Trang 20III Hiện thực chương trình:
Tên đề tài: Xây dựng ứng dụng mô hình Client/Server thực hiên công việc sau: Client (Mobile) gửi
câu tiếng anh (text) lên server Server (Trên PC) trả về câu tiếng việt (Dùng thư viện Google).
Quá trình làm việc: nhóm sử dụng J2ME để viết phần mềm dịch chạy trên nền điện thoại di động,
Về mặc chức năng, chương trình có 2 đối tượng chính:
+ phía client: đảm nhận việc nhận và gửi các đoạn test cần dịch mà người dùng nhập vào đếnserver, chờ server xử lý, sau đó nhận kết quả trả về từ server
+ phía server: nhận dữ liệu gửi từ client, xử lý (kết nối đến server google) và sau đó trả về kết quả cho client
Trang 21+kết nối trực tiếp đến server của google với cú pháp có sẵn và nhận được kết quả dịchđược trả về từ server của google.
+kết nối đến một server trung gian đặt tại 1 host trên internet (http://tiuliuliuliu.vnn.ms) Server này sẽ chuyển tiếp yêu cầu đến server của google sau đó nhận kết quả dịch được trả về từ server của google và trả kết quả này về cho client (tại trang web http://tiuliuliuliu.vnn.ms sẽ được viết code php để xử lý)
Vấn đề đa ngôn ngữ: chương trình hỗ trợ cho 4 ngôn ngữ và người dùng có thể lựa chọn ngôn ngữ thích hợp bằng cách sử dụng RMS để lưu cấu hình, nên tất cả các cấu hình mà
người dùng đã lựa chọn sẽ được lưu lại để đảm bảo chương trình hoạt động theo đúng ýmuốn người dùng mà không cần phải cấu hình nhiều lần
Yêu cầu: để chạy được ứng dụng này thì yêu cầu điện thoại phải có kết nối GPRS hoặc 3G
Trang 22IV Hướng dẫn cài đặt và sử dụng:
Bạn chỉ cần doubleclick vào file *.jad thì tự động chương trình sẽ đươc thực thi trên điện thoại giả lập của Java wireless toolkit
2 Hướng dẩn sử dụng:
2.1 Dịch văn bản
Sau khi chương trình chạy thì bạn sẽ thấy giao diện như hình dưới Muốn dịch đoạn
test nào bạn chỉ cần nhập đoạn test đó vào rồi nhấn nút Translate Có thể chương trình
sẽ hỏi bạn về một số vấn đề kết nối mạng, bạn hãy chọn yes Ngay sau đó kết quả dịch
sẽ hiển thị ra ngay phía dưới