Tải bản đầy đủ (.doc) (120 trang)

Đồ án xử lý ảnh trong Java

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (898.2 KB, 120 trang )

Mục lục
5
Lời giới thiệu 5
Chơng 1 7
Java và những hứa hẹn 7
1.1 Java là gì và nó bắt nguồn từ đâu ? 7
1.2 Java: u điểm và nhợc điểm 8
Ưu điểm 8
Nhợc điểm 10
1.3 Mô hình HTML và mô hình Java 11
Mô hình HTML 11
Mô hình Java 12
1.4 Môi trờng phát triển Java 12
Tạo một file nguồn 13
Biên dịch file nguồn 13
Chạy ứng dụng 13
Phân tích một ứng dụng Java 13
Lời giải thích trong Java 14
Định nghĩa một lớp 14
Phơng thức main (Main Method) 14
Tạo một file Java nguồn 15
Biên dịch file nguồn 15
Tạo file nguồn gồm cả Applet, tạo ra file HTML 15
Chạy Applet (Running Applet) 15
Import Classes and Packages 16
Định nghĩa một phân lớp Applet 16
Chơng 2 17
Tổng quan về mạng máy tính 17
2.1 Bạn đã biết những gì về mạng Internet trong Java 17
Nạp Applet từ mạng 17



1
Nạp một ảnh từ mạng 17
Cơ sở về mạng 17
TCP 18
UDP 18
PORTS 18
2.2 Lớp mạng trong JDK 19
2.2.1 - Thao tác với URL 19
Đọc và ghi một đối tợng URLConnection 24
2.2.2 Socket 25
Socket là gì ? 25
Đọc và ghi một socket 26
Chơng 3 28
Xử lý tín hiệu số 28
3.1 Mở đầu và phân loại 28
3.2 Tín hiệu rời rạc 30
Một số dãy tín hiệu rời rạc đặc biệt: 30
Các phép toán với tín hiệu rời rạc: 31
Các hệ thống xử lý tín hiệu rời rạc: 31
3.3 Phép biến đổi Fourier của tín hiệu rời rạc 33
Phổ biên độ, phổ pha, phổ năng lợng: 35
Lấy mẫu và khôi phục tín hiệu liên tục theo thời gian 35
Khôi phục tín hiệu tơng tự từ tín hiệu lấy mẫu: 37
Chơng 4 39
xử lý âm thanh số 39
4.1 - Tại sao chúng ta cần xử lý tín hiệu số 40
Phổ của tín hiệu là gì 40
Lấy mẫu tín hiệu 43
4.2 - Các file Audio 44

Gói Sun.audio 44
Lớp AudioStream 45


2
Lớp AudioData 46
Lớp AudioDataStream 46
Lớp AudioStreamSequence 47
Lớp AudioPlayer 48
Cơ sở luật mã hoá à 48
Giới thiệu chơng trình 51
Lớp UlawCodec 52
Lớp Oscillator 54
Lớp OscopeFrame 57
Lớp DoubleGraph 60
Chơng 5 61
Nguyên tắc chuyển đổi 61
âm Thanh số 61
5.1 - DFt 61
Tính số lợng bit cần thiết để lấy mẫu 63
Lớp futils. Timer : làm chuẩn DFT 64
Benchmarking 65
IDFT 65
5.2 FFT 67
Lớp FFT 69
Tính log của số nguyên 70
Kiểm tra FFT và IFFT 71
Tính PSD 72
Thực hiện chuyển đổi bằng chơng trình 73
Lọc tạp âm bằng FFT 77

Khe hở phổ 78
Bộ lọc thông cao (the Hight-Pass Filter) 80
Chơng 6 82
Giới thiệu về xử lý ảnh 82


3
6.1 máy quét và Video Camera 82
6.2 Giao diện Observer 84
6.3 - ảnh số và Các dạng file ảnh 90
DATABAHN 90
Một số các dạng ảnh cơ bản 90
Chuyển đổi giữa hai dạng Vector và Bipmap 91
Một số dạng ảnh khác 92
Độ sâu màu, bảng màu, sự trong suốt 92
Phơng thức nén 94
Một số các dạng ảnh thông dụng 97
Chơng 7 104
xử lý ảnh trong Java 104
7.1 HISTOGRAM 104
7.2 Biến đổi DFT trong không gian hai chiều 105
Lớp FFTPlane 107
ProcessPlane 108
Lớp Slope 111
Lớp Points 112
7.3 các mô hình màu 113
Hệ màu HLS 115
Hệ màu IYQ 115
7.4 Hình ảnh 116
Tài liệu tham khảo 120



4

Lời giới thiệu
Ngày nay việc ứng dụng máy tính không chỉ dừng lại ở mức độ trong các
phòng thí nghiệm, các trung tâm máy tính hay các văn phòng nữa mà nó đã mở
rộng ra và trở thành một phơng tiện giải trí trong gia đình hay thậm trí trở thành
một phơng tiện dạy học. Hơn nữa các dữ liệu của ngời sử dụng cũng không đơn
thuần chỉ là những tập văn bản, hồ sơ hay các tài liệu nghiên cứu mà nó còn
bao gồm cả những dữ liệu âm thanh và hình ảnh. Hiện nay, trên thế giới và tại
Việt Nam chúng ta đã quen thuộc với khái niệm xử lý tín hiệu số, là một bộ phận
rất quan trọng trong lĩnh vực máy tính; nhng để có đợc các thuật toán đòi hỏi
chúng ta phải có một số các kỹ thuật đi kèm. Vấn đề truyền dữ liệu trên mạng
mà điển hình là âm thanh và hình ảnh số cũng là một nhu cầu cần phải đợc đáp
ứng. Vì vậy các đáp ứng về mạng không ngừng đợc cải tiến để đảm bảo việc
truyền dữ liệu có hiệu quả. Mặt khác trong thời đại multimedia, xử lý tín hiệu là
sự giao nhau của các lĩnh vực toán học, kĩ thuật tính toán, và khoa học máy tính.
Trong thời gian làm đồ án tốt nghiệp em tập trung tìm hiểu về các thuật
toán và các ứng dụng của xử lý tín hiệu âm thanh và hình ảnh bằng ngôn ngữ lập
trình Java, các modul đợc đặt trong chơng trình Diffcad.java. Đồ án gồm có 7
chơng:
Chơng 1: Giới thiệu về java. Chơng này trình bày một cách khái quát về sự
ra đời và một số đặc trng của Java.
Chơng 2: Giới thiệu về mạng máy tính trong Java.


5
Chơng 3: Xử lý tín hiệu số; trình bày các khái niệm cơ bản và tập trung một
phần vào phép biến đổi Fourier của tín hiệu rời rạc.

Chơng 4: Âm thanh số; trình bày các kỹ thuật và các nguyên tắc cơ bản của
việc lấy mẫu, mã hoá của các file âm thanh trên mạng. Đa ra các
chơng trình thực hiện các thuật toán trên.
Chơng 5: Nguyên tắc chuyển đổi âm thanh số. Chơng này đi sâu vào các phép
biến đổi DFT và FFT cùng với một số các phép xử lý khác đợc
thực hiện bằng chơng trình.
Chơng 6: Giới thiệu về xử lý ảnh.
Chơng 7: Xử lý ảnh trong Java.
Em xin chân thành cảm ơn TS Quách Tuấn Ngọc, các anh chị và các bạn công
tác tại trung tâm Công nghệ thông tin, bộ Giáo Dục và Đào tạo đã nhiệt tình
giúp đỡ trong thời gian làm đồ án tốt nghiệp vừa qua. Do thời gian và khả năng
có hạn nên bản báo cáo này không tránh khỏi các thiếu sót, rất mong sự góp ý,
giúp đỡ của các thầy cô và các bạn.
Hà Nội 5/1999
Lê Quang Trung


6
Chơng 1
Java và những hứa hẹn
Trong chơng này chúng ta bắt đầu tìm hiểu ngôn ngữ lập trình java, những u
điểm và những nhợc điểm của nó. Cách nhìn nhận tổng quát về ngôn ngữ Java
đã đợc biết tới nh cách nhìn về một ngôn ngữ lập trình đặc biệt cùng với các môi
trờng lập trình. Khi nói tới cụm từ kĩ thuật java (Java Technology) có nghĩa là ta
muốn nói đến cả phần cứng cũng nh phần mềm.
1.1 Java là gì và nó bắt nguồn từ đâu ?
Thuật ngữ Java bao hàm cả hai mặt ngôn ngữ và các kĩ thuật cung cấp cho
ngôn ngữ. Khi nói tới Java programming language, nghĩa là đang nói về một
ngôn ngữ lập trình hớng đối tợng phát triển bởi hãng Sun Microsystem. Về mặt
cú pháp nó cũng giống nh các ngôn ngữ thông thờng khác, đợc phát triển từ C,

C++ và Objective C. Java chấp nhận mô hình của ZetaLisp, một phần mở rộng
của LISP và chạy nhanh hơn các máyLISP.
Khi chúng ta nói tới Java techonology, cũng có nghĩa chúng ta nói về ngôn
ngữ lập trình java và hệ thống mà nó cung cấp. Hệ thống bao gồm một th viện
lớn các lớp đợc gọi là Java class libraries. Java techonology cũng bao
hàm cả cách chạy chơng trình, hoạt động dựa trên một machine Java. Java
techonology cho phép thực thi các machine Java bằng cách sử dụng mọi nối kết
phần cứng và phần mềm. Khi machine java đợc thực thi trên phần mềm thì nó đ-
ợc gọi là máy ảo Java (Java virtual machine).
Một trong những mục tiêu khi thiết kế java là nhằm đạt đợc hiệu quả khi thực
hiện các tính toán độc lập. Trong mô hình tính toán độc lập, mã (code) đợc nạp
để thực thi các đòi hỏi có tính chất bảo mật. Nếu mã nguồn (source code) là
không đáng tin cậy thì source code đợc xử lí thiếu chính xác đối với dữ liệu của
ngời dùng và phần cứng máy tính. Sự nguy hại của dữ liệu ngời dùng có thể bao
hàm cả phép truy cập và phép phân bố các thông tin dễ bị tác động nh số thẻ tín
dụng, số tài khoản và các dữ liệu có tính chất sở hữu khác.
Nếu chúng ta xem xét tất cả các Web server nh một phần của hệ thống máy
tính lớn, thì Web là một hệ điều hành lớn nhất trên thế giới. Trên thực tế, ngôn
ngữ lập trình của Web là java, và nữa, với cách nhìn này thì Java là một ngôn
ngữ lập trình hệ điều hành. Sun có kế hoạch đa ra Java machine không ảo tức là
các Java machine thực hiện trên phần cứng. Hệ điều hành cho các máy nh vậy sẽ
đựoc viết bằng Java. Mọi ngời sẽ không phải viết mã cryptic C cho phần Kernel
của hệ điều hành mà nó sẽ đợc viết bằng Java.
Các chip Java sẽ đợc giảm giá mạnh, một số các thiết bị đợc nhắm tới nh TV
set-top box, cellular telephone, paper, digital TV, smart VRC, PDA, máy in, máy


7
copy v v sẽ đợc máy tính trợ giúp, tức là Sun muốn tất cả các máy tính đều chạy
Java. Bởi vì các chip đợc chạy trên mã byte code, nên nó không cần biên dịch

just- in -time. Các thiết bị sẽ không cần màn hiển thị, bộ nhớ lớn và nối kết mạng
Internet.
Sun Microelectronics gọi kiến trúc chip đầu tiên là Java One. Hiện nay Sun
đã có hai họ chip là microJava và ultraJava. MicroJava đợc sử dụng với mục đích
cung cấp cho các thị trờng trong lĩnh vực điều khiển. UltraJava có mục đích cung
cấp cho các workstation. Cơ sở của kĩ thuật này là một ngăn xếp super-scalar dựa
vào tập chỉ dẫn rút gọn của máy tính (RISC) gọi là picoJava. Đợc gọi là super-
scalar bởi vì nó thi hành kênh bốn trạng thái cho phép các phần khác nhau của
bộ xử lí làm bốn nhiệm vụ khác nhau cùng một lúc. Gọi là RISC bởi vì nó thực
thi hầu hết các chỉ dẫn trong một chu kì đồng hồ. Tính toán trong một kênh của
super-scalar giống nh các dòng assembly. Dữ liệu đợc xử lí dòng nọ tiếp dòng
kia. Trên hình 1.1 chỉ ra các kênh, khi đợc điền, sẽ cho phép picoJava tìm thấy,
giải mã, thi hành, và lu giữ sau đó trả lại kết quả. Trong quá trình tìm, picoJava
sử dụng bốn byte cache đa vào ngăn xếp. Ngăn xếp là tập hợp 64 thanh ghi 32
bits trên một chip. Sau khi lu trên chip, RAM đợc sử dụng để thực hiện cùng với
ngăn xếp.
Hình 1.1 Kênh picoJava bốn trạng thái
1.2 Java: u điểm và nhợc điểm
Ưu điểm
Java là một ngôn ngữ định kiểu mạnh. Tất cả các tên của lớp đều đợc xác
định kiểu và sử dụng để kiểm tra mọi sự tham chiếu tới lớp khi đợc thông
qua nh một đối số của phơng thức. Hầu hết các ngôn ngữ bậc cao hiện nay
đều có đặc điểm này, mặc dù kiểu C cũ thì lại tránh điều đó.
Java thì nhỏ: Java dựa trên kiểu biên dịch mã byte (byte code). Chứa cả
microkernel của chính nó, biên dịch mã byte cộng thêm lớp phụ là 215KB.
Điều này là một hoạt động có hiệu quả. Có nghĩa là biên dịch mã byte có thể
nằm gọn trong ROM và đa ra các microcontroller để chạy chơng trình java.


8

Java là dễ dàng dịch chuyển: Java là một ngôn ngữ đa nền (multi-platform).
Khẩu hiệu của Java là viết một lần chạy mọi nơi (Write Once, Run
Anywhere). Bởi vì ở đây chỉ xác định có một máy ảo, Java đa ra một giao
diện lập trình không chuẩn tắc tới các applet và các ứng dụng trên mọi phần
cứng. Nền Java là lí tởng cho Internet, ở đó chơng trình có thể đợc chạy trên
mọi máy tính trong mạng. Khi ta biên dịch mã nguồn của Java, ta phải thực
thi trên các mã byte (byte code). Mã byte đợc tạo thành bởi trình biên dịch
của Java và cấu trúc nên các chỉ dẫn tới Java virtual machine. Java là một
ngôn ngữ dễ dịch chuyển cho phép chạy trên mọi phần cứng mà máy ảo
Java có thể chạy. Mã byte lu trong file .class, đợc nạp tới máy ảo Java và
chứa cả biên dịch mã byte. Trên hình 1.2 là mối quan hệ giữa chơng trình
Java và phần cứng.


Hình 1.2
Java là hớng đối tợng: Java là ngôn ngữ lập trình hớng đối tợng. Trong mô
hình hớng đối tợng, một biến kiểu đối tợng chứa các dữ liệu cũng nh các
thuật toán cần thiết để thao tác với dữ liệu. Ngợc lại một ngôn ngữ lập trình
không hớng đối tợng là ngôn ngữ lập trình coi các biến nh một đối số tham
chiếu tới thủ tục. Không giống nh Pascal, C, Fortran, C++, Java không có
hàm (function). Trong Java tất cả các phơng thức (method) đều nằm trong
các lớp (classes). C++ là một ngôn ngữ có mở rộng về hớng đối tợng. Điều
này có nghĩa là ngời lập trình không hớng đối tợng có thể viết đợc trong C+
+, nhng một điều nh vậy không đợc cho phép trong Java.
Java không có con trỏ: Java thì crash-proof hơn C, C++ và Pascal - một đặc
điểm tốt hơn. Lí do là Java không cung cấp một kĩ thuật nào cho phép thao
tác với con trỏ một cách trực tiếp. Do đó không có cách cho ngời lập trình
thao tác với địa chỉ bộ nhớ. Theo nhiều cách khác nhau một con trỏ không
đúng có thể gây lỗi cho bộ nhớ hay chơng trình. Chúng ta không đủ không
gian nhớ để liệt kê tất cả chúng. Chúng ta có thể cảm ơn rằng java không có

con trỏ.
Java không có Multiple Inheritance: đa kế thừa đã đợc biết tới trong C++,
nhng đợc loại bỏ trong Java. Đa kế thừa là tính chất có hai hay nhiều lớp cơ
sở trực tiếp bên dới một lớp. Vấn đề đặt ra đối với đa kế thừa là sự chồng
chéo các tên phơng thức cũng nh các biến, chúng phải trùng tên nhau dựa


9
Animal
theo một quy tắc của ngôn ngữ và dờng nh thờng xuyên bị quên bởi các ngời
lập trình. ở đây chỉ có một kiểu kế thừa đợc cho phép là kiểu a-kind-of
(AKO). Trên hình 1.3 là một ví dụ kiểu kế thừa AKO.
Java có Garbage Collection: Java có phép lu trữ tự động bao gồm cả kĩ thuật
thu rác (rác đợc xem là các dữ liệu không còn giá trị sử dụng). Thu rác cho
phép máy ảo Java giành lại bộ nhớ đợc sử dụng bởi các biến bị loại bỏ. Để
thực hiện thu rác trong chơng trình ta sử dụng phơng thức gc() thuộc lớp
System và viết nh sau System.gc(). Nh vậy bạn không phải lo lắng về việc
giữ lại các dấu vết của bộ nhớ.




Hình 1.3
Java có các th viện lớp nền tảng: Java có các th viện nền tảng chứa
Abstract Window Toolkit (AWT). AWT cho phép giao diện ngời dùng
đồ hoạ kiểu hớng đối tợng đợc thay đổi trong các chơng trình. Th viện gồm
có tám gói chính và số lợng ngày càng tăng. Gói input/output
java.io cho phép thao tác với dữ liệu vào và ra. Gói mạng java.net,
cho phép thao tác với các socket và URL. Gói tiện ích java.util cho phép
tthực hiện một số thao tác với hệ điều hành nh xem ngày tháng, thời gian,

số ngẫu nhiên,v v
Nhợc điểm
Đôi khi thu rác là một việc làm ít hiệu quả: mặt hạn chế của việc thu rác nh
sau. Thu rác có thể dẫn tới chơng trình không quyết định đợc thời gian chạy.
Đối với hệ thống lớn, thu rác có thể sử dụng một lợng thời gian xác định nào
đó của bộ vi xử lý.
Java không phải là một ngôn ngữ hớng đối tợng thuần tuý. Chúng ta không
có khả năng tạo ra các instance của kiểu dữ liệu primative. Các kiểu dữ liệu
cơ bản trong Java là boolean, int, long, float, double, char
và byte. Ngợc lại trong Smalltalk thì tất cả các kiểu dữ liệu đều là các lớp.
API thiếu nhiều đặc trng: java thiếu các đặc trng có tính chất chìa khóa cho
một vấn đề. Ví dụ nó không cho phép chúng ta lập trình với các cổng nối
tiếp (cho dù hầu hết các máy tính đều có ít nhất một cổng) cũng nh không
cho phép đa ra máy in nếu đang ở trong một chơng trình Java. Java là một
ngôn ngữ mới, và bởi vì các đặc trng còn thiếu trong API, Java có thể không
dễ dàng sử dụng cho một số các ứng dụng nào đó.


10
Bird
Reptile
Mamal
Human
Student
Professor
Java không có phơng thức đảo cung cấp cho C++: có thể chúng ta muốn mở
rộng các đặc trng của Java API bằng cách lập trình trên một ngôn ngữ khác.
Thật không may là ngôn ngữ lựa chọn này chỉ có giới hạn là C. Không có
cách nào nối giữa Java và C++, một phần có thể do vấn đề về name-space
mangling. Trong C++, chức năng mã nguồn đợc định danh trong các hàm

khác tên nhau đối với trình nối kết. Điều này đợc gọi là name-space
mangling. Các hàm đợc đọc trệnh đi dựa vào kiểu đối số của nó. Bởi java
không có cách nhận biết hàm sẽ đợc đọc trệnh nh thế nào nên hàm sẽ không
đợc gọi tới.
1.3 Mô hình HTML và mô hình Java
Mô hình HTML cho phép tham chiếu tới một tài liệu dới dạng các file khác
kiểu nhau. Một Browser đọc các tham chiếu tới file HTML và chuyển chúng
tới chơng trình giải mã. Ví dụ, nếu một file là dới dạng nén thì browser tự động
giải nén nó.
Thiếu xót không tránh đợc trong mô hình này là browser có thể tăng lên
không có giới hạn. Ví dụ với Netscape browser, nó yêu cầu 16 MB RAM. Khi
một ứng dụng trở nên lớn hơn, chúng có xu hớng làm chậm các tác vụ bình th-
ờng khác. Sau đây chúng ta so sánh mô hình HTML (HTML model) và mô hình
Java (Java model). Trong Java model, các mã đợc biên dịch trong các file có
đuôi .class và sau đó sẽ nạp xuống đa vào trong các applet thông qua mạng.
Mô hình HTML
Trên Internet, các máy tính đều chạy dịch vụ Hypertext Transfer Protocol
(HTTP). Các dịch vụ HTTP đa dữ liệu đáp ứng cho các Web browser. Một cách
tổng quát, dữ liệu ở các dạng khác nhau và HTML không cần giải mã các dữ
liệu. Kết quả là Internet HTTP server cung cấp miền lớn các dạng dữ liệu tới các
client nối với nó.
Trong HTML model, dữ liệu thô đợc ghi trong HTML document bằng một
tham chiếu siêu văn bản (hyper text reference). Để thực hiện giải mã dữ liệu với
một số lớn các dạng dữ liệu khác nhau, browser có sử dụng các ứng dụng trợ
giúp. Nhằm sắp xếp dữ liệu đúng với ứng dụng trợ giúp, browser có một giao
thức là Multipurpose Internet Mail Extension (MIME) cho phép dịch vụ HTTP
truyền dẫn cùng với dữ liệu. Dựa trên MIME, một bảng tìm kiếm xác định xem
dữ liệu đợc giải mã và hiển thị nh thế nào.
Một vấn đề khác. Dữ liệu thờng đợc hiển thị trong các khuôn dạng điện tử
rất đa dạng. Giả sử có một tài liệu Microsoft Word cung cấp trên Web, ta có thể

xem nó nh một Word document nhng Word 5 trên Mac không thể đọc đợc các
Word 6 hay 7. Vì vậy phải có một file RFT (Rich text format) để Word 5
có thể nhận biết hầu hết nội dung trong tài liệu. Tài liệu kiểu Word Document
thờng đợc chuyển sang dạng HTML nhằm cho phép mọi browser trên mạng có
thể "nhìn" nó. Thêm nữa HTML chỉ đáp ứng các đồ họa dới dạng ảnh GIF và
không duy trì trang tài liệu nguồn nguyên thuỷ dới dạng Word document. Ta
cũng có thể sử dụng PostScrip để nạp và in các tài liệu, tuy nhiên không cho
phép soạn thảo lại tài liệu và cũng không phải mọi file PostScrip đều có thể in đ-
ợc với các máy in. Bên cạnh đó, Adobe có tiến thêm một bớc trong Portable


11
Document Format (PDF) cho phép xem và in tất cả các tài liệu. Tuy vậy còn tồn
tại vấn đề là ngời dùng không thể soạn thảo lại các tài liệu này.
Mô hình Java
Mô hình Java khắc phục một số thiếu sót của mô hình HTML nhng nó không
dành lấy đợc sự chấp nhận rộng rãi. Trong Java, các mã byte tạo ra sau khi biên
dịch đợc lu trong các file .class. Các file này đợc nạp xuống các class loader của
máy client. Sau khi kiểm tra, máy ảo Java sẽ phiên dịch các mã byte.
Nguyên tắc hoạt động của trình biên dịch Java có dạng nh trên hình 1.4.


Hình 1.4
Cùng với Java, một thuật toán giải mã các dạng dữ liệu mới có thể đợc nạp
tuỳ theo câu lệnh. Tức là Web là một hớng đối tợng trong hoàn cảnh, dữ liệu đợc
nhập cùng với chơng trình để thực hiện một tác vụ. Mô hình Java là một cải tiến
lớn đáp ứng nhu cầu hiện tại, nó yêu cầu chúng ta có một giải pháp cho việc giải
mã trên phần cứng của ta.
Nguyên tắc của mô hình Java trên mạng nh trên hình 1.5
Runtime System/ Hardware


Java Source
Interpreter Just-In-Time
Compiler

Compiler Byte Code Verifier
Byte Codes Network ClassLoader
Hình 1.5
1.4 Môi trờng phát triển Java
Có nhiều sự chọn lựa có giá trị để phát triển Java, bao gồm các sản phẩm của
Sun (Java Workshop, Java Developers Kit (JDK)), Metrowerks' CodeWarrior, các sản
phẩm Symantec(Visual Café, Visual Café Pro, Café). Microsoft J++, Asymetrix
SuperCede và các chọn lựa khác. Để có thêm chi tiết ta hãy xem trên địa chỉ:
htt://www.javasoft.com/products/JDK/; etec
.com, http:/roaster.com/roaster/ và
J++ chạy trên Window 95/NT. Workshop có chỉ chạy trên Solaris và
Windows 95/NT. Các sản phẩm của Symantec và CodeWarrior chạy trên MacOS
và Window 95/NT.
Sau đây chúng ta hãy xem xét một ứng dụng đơn giản nhất của java trên môi
trờng JDK. Chúng ta tìm hiểu chi tiết cách tạo , biên dịch và chạy các chơng


12

Java Source
(*.java)
Java
Compiler
JavaClasses
(*.class)

trình Java. Sử dụng nền Java Development Kit (JDK). Ta có thể tìm thêm các
thông tin trên địa chỉ />Tạo một file nguồn
Sử dụng một trình soạn thảo, tạo một file có tên là Hello.java với các dòng
lệnh nh sau:
/**
* The Hello class implements an application that
* simply display Hello world to the standard output
*/
class Hello {
public static void main ( String[] args){
System.out.println( Hello World);
}
}
Biên dịch file nguồn
Biên dịch file nguồn bằng trình biên dịch của Java.
UNIX: javac Hello.java
DOS shell (Windows 95/NT): javac Hello.java
Nếu biên dịch thành công, trình biên dịch sẽ tạo ra file tên là Hello.class
trong cùng th mục với file nguồn Hello.java. File kiểu class này chứa các mã
byte . Nếu biên dịch không thành công, thì hãy chắc chắn ta nhập đúng kiểu và
tên của chơng trình chính xác nh chỉ ra ở trên hay không, và hãy chắc chắn chữ
thờng, chữ hoa có đúng nh trong tên file không.
Chạy ứng dụng
Chạy chơng trình bằng Java interpreter:
UNIX: java Hello
DOS shell( Window 95/NT) java Hello
khi đó trên màn hình ta sẽ nhận đợc dòng chữ : Hello World.
Phân tích một ứng dụng Java
Bây giờ hãy nhìn vào chơng trình nguồn, chúng ta có thể phân vân không
biết nó làm việc nh thế nào và nó giống các ứng dụng khác thế nào. Chơng trình

nguồn gồm hai khối lệnh chính, khối đầu tiên nằm ở phần đầu của chơng trình
sử dụng kí hiệu /** và */. Ngôn ngữ java cung cấp một trong ba kiểu kí tự đánh
dấu // để đa các lời giải thích vào chơng trình tơng tự nh trong C, C++. Trong
Java, mỗi phơng thức (đợc coi là một hàm chức năng giống nh một khối các mã
lệnh) và biến nằm gọn trong một lớp. Java không cung cấp các biến và các hàm
toàn cục. Do đó có thể xem khung của chơng trình java là một definition class.
Điểm truy nhập vào mỗi một ứng dụng Java là phơng thức main của nó. Khi
chạy ứng dụng cùng với java interpreter cần phải chính xác hoá tên lớp
muốn chạy. Interpreter sẽ gọi đến phơng thức main trong lớp đó. Phơng thức
main điều khiển luồng chảy của chong trình, cấp phát mỗi khi nguồn đợc gọi
tới, và chạy tất cả những phơng thức khác liên quan đến ứng dụng đó.


13
Lời giải thích trong Java
Trong Java có các kiểu trích dẫn lời giải thích nh sau:
/* text */ : trình biên dịch bỏ qua mọi thứ nằm trong cặp dấu này.
/** documentation */ : Dùng để chỉ ra một documentation comment, trình
biên dịch cũng bỏ qua nh đối với /* và */. Công cụ javadoc của JDK sử dụng lời
chú giải doc khi chuẩn bị tự động tạo ra documentation. Để có thêm thông tin về
javadoc hãy xem trên />ml#tools.
// text : trình biên dịch bỏ qua mọi thứ kể từ dấu // cho đến cuối dòng.
Định nghĩa một lớp
Dòng đầu đợc tô đậm trong phần chơng trình ở dới là khối định nghĩa lớp:
/**
* The Hello class implements an application that
* simply display Hello world to the standard output
*/
class Hello {
public static void main ( String[] args){

System.out.println( Hello World); // Display the String
}
}
Lớp là một khái niệm cơ bản, gồm một khối các câu lệnh của ngôn ngữ lập
trình hớng đối tợng giống nh kiểu java. Nó là một bản chi tiết mô tả trạng thái,
cách thức thực hiện đợc nối kết với instance của lớp đó. Khi ta khởi tạo một
lớp, ta tạo ra một đối tợng mà nó có cùng các trạng thái, cách thức thực hiện nh
các instance khác của cùng lớp đó. Trạng thái nối kết với lớp hay đối tợng đợc
lu trong các biến thành phần member variables. Cách thức thực hiện nối kết
với lớp hay đối tợng đợc thực thi trong các phơng thức.
Phơng thức main (Main Method)
Dòng đợc tô đậm là điểm bắt đầu và kết thúc của khai báo phơng thức main.
/**
* The Hello class implements an application that
* simply display Hello world to the standard output
*/
class Hello {
public static void main ( String[] args){
System.out.println( Hello World);
}
}
Mỗi ứng dụng Java đều có một phơng thức main đợc khai báo nh sau:
public static void main(String[] args)
Phơng thức main đợc khai báo cùng với ba từ khoá:
public: cho phép các đối tợng gọi tới phong thức main.
static : có nghĩa là phơng thức main là một phơng thức kiểu lớp.
void: chỉ ra rằng phơng thức main không trả lại giá trị.


14

Phơng thức main trong Java tong tự nh hàm main trong C, C++. Khi yêu cầu
tới java interpreter, ta phải chỉ rõ tên lớp muốn chạy. Lớp này là lớp điều khiển
ứng dụng và phải có phơng thức main.
Sau đây là cách tạo ra và sử dụng một applet-một chơng trình Java có thể
đợc đa vào trang HTML và chạy trên các Java-enabled browsers.
Tạo một file Java nguồn
Sử dụng một trình soạn thảo văn bản tạo ra một file tên là HelloWorld.java
với các dòng nh sau:
import java.applet.Applet;
import java.awt.Graphics;
public class HelloWorld extends Applet {
public void paint(Graphics g) {
g.drawString( Hello world!, 50, 25 );
}
}
Biên dịch file nguồn
Sử dụng trình biên dịch của java:
UNIX: javac HelloWorld.java
DOS shell(Window 95/NT): javac HelloWorld.java
Nếu biên dịch thành công thì sẽ tạo ra file HelloWorld.class trong cùng th
mục với file nguồn. File class chứa các mã byte.
Tạo file nguồn gồm cả Applet, tạo ra file HTML.
Sử dụng một trình soạn thảo tạo ra file có tên là Hello.html trong cùng th mục
với file HelloWorld.class. Nội dung file HTML nh sau:
<HTML>
<HEAD>
<TITLE> A Simple Program </TITLE>
</HEAD>
<BODY>
Here is the output of my program:

<APPLET CODE= HelloWorld.class WIDTH=150 HEIGH=25>
</APPLET>
</BODY>
</HTML>
Chạy Applet (Running Applet)
Để chạy applet, ta phải nạp file HTML vào một Browser cung cấp JDK( cũng
có thể sử dụng Applet Viewer cung cấp bởi JDK thay vì một Web browser đầy
đủ). Để nạp file HTML ta cần báo cho browser biết file URL hay file HTML ta
vừa tạo. Ví dụ có thể nhập vào trờng địa chỉ hay vị trí của browser giống nh dới
đây:
file:/home/kwaTrath/java/Hello.html
Hầu hết các browser cho phép mở một file từ bảng chọn File trên browser.
UNIX : appletviewer file:/home/kwaTrath/java/Hello.html
DOS shell:appletviewer file:/home/kwaTrath/java/Hello.html


15
Import Classes and Packages
Để sử dụng các th viện (các gói lớp) có sẵn cung cấp bởi java, hay các th viện
do ngời lập trình tạo ra, java sử dụng từ khoá import. Ta hãy xem ví dụ sau. Hai
dòng đầu liệt kê hai lớp đợc sử dụng trong applet: Applet và Graphics
import java.applet.Applet;
import java.awt.Graphics;
public class HelloWorld extends Applet {
public void paint(Graphics g) {
g.drawString( Hello world!, 50, 25 );
}
}
Nếu bỏ đi hai dòng này, ta vẫn có thể biên dịch và chạy chơng trình nếu
thay đổi nh sau (chữ in đậm)

public class HelloWorld extends java.applet.Applet {
public void paint(java.awt.Graphics g) {
g.drawString( Hello world!, 50, 25 );
}
}

Nh vậy nhập vào hai lớp Applet và Graphics nhằm cho phép chơng trình
tham chiếu tới lớp mà không phải viết các tiếp đầu ngữ kiểu java.applet.hay
java.awt Các tiếp dầu ngữ này báo cho trình biên dịch biết gói nào đợc tìm
kiếm cho lớp Applet và Graphics. Chúng ta có thể nhập các lớp đơn nh trên hoặc
nhập cả gói. Ví dụ :
import java.applet.*;
import java.awt.*;
public class HelloWorld extends Applet {
public void paint(Graphics g) {
g.drawString( Hello world!, 50, 25 );
} }
Định nghĩa một phân lớp Applet
public class HelloWorld extends Applet {

}
Từ khoá extends chỉ ra lớp HelloWorld là một subclass của lớp Applet. Cho
biết lớp HelloWorld là một lớp mới đợc mở rộng từ lớp Applet, kế thừa các ph-
ơng thức sẵn có của lớp Applet.


16
Chơng 2
Tổng quan về mạng máy tính
Để thao tác các tác vụ với mạng internet thông qua ngôn ngữ Java chúng ta

hãy xem xét cơ sở của mạng trong Java.
2.1 Bạn đ biết những gì về mạng Internet trong Java ã
Thuật ngữ network gây sự lo ngại cho nhiều ngời lập trình nhng chúng ta
đừng nên lo ngại. Sử dụng mạng thì rất dễ dàng và thuận tiện đồng thời cho phép
cung cấp các java platform. Sau đây chúng ta đi tìm hiểu một số nét cơ bản về
mạng internet cùng với java.
Nạp Applet từ mạng
Nếu truy nhập vào mạng và tới một java-compatible Browser, bạn không chắc
chắn sẽ thi hành đợc nhiều applet. Applet mà ta đang chạy, đợc tham chiếu bởi
một nhãn đặc biệt trong file HTML đó là nhãn <APPLET>. Applet có thể định
vị mọi nơi; trên máy đơn hay một nơi bất kì trên mạng. Vị trí của applet đợc chỉ
ra bằng mã lệnh trong nhãn <APPLET>, khi đó browser sẽ giải mã vị trí và chạy
applet này. Nếu applet nằm trên một số máy khác ngoài máy của ta, browser
phải nạp applet trớc khi chạy nó. Browser thực hiện tất cả các lời nối kết tới
mạng và nhận dữ liệu từ đó, bằng cách ấy sẽ cho phép bạn chạy từ mọi nơi trên
mạng.
Nạp một ảnh từ mạng
Nếu bạn có dự định lập trình với các applet và các ứng dụng thì bạn phải sử
dụng một lớp có tên java.net nằm trong gói URL. Lớp này đa ra một Uniform
Resource Location (URL), là địa chỉ một tài nguyên trên mạng. Applet của bạn
cùng các ứng dụng có thể sử dụng một URL để tham chiếu và nối kết tới các tài
nguyên trên mạng. Ví dụ để đa môt hình ảnh từ mạng, chơng trình Java phải tạo
ra một đối tợng URL chứa địa chỉ của ảnh đó. Chúng ta sẽ nói chi tiết hơn trong
phần sau.
Cơ sở về mạng
Máy tính chạy trên mạng giao tiếp với các máy khác bằng các giao thức nh
Transport Cotrol Protocol (TCP) hay User Datagram Protocol (UDP)
có dạng nh hình sau.



17
Application
(HTTP,fft,telnet )
Transport
(TCP, UDP, )
Network
(IP, )
Link
(device driver, )
Khi viết chơng trình Java giao tiếp với mạng, thì phải lập trình tại lớp ứng
dụng (lớp Application). Trên thực tế chúng ta không cần phải lo về các lớp TCP
và UDP. Thay cho điều này chúng ta có thể sử dụng các lớp chuẩn có sẵn nằm
trong gói java.net của java.
TCP
Khi hai ứng dụng muốn cùng giao tiếp với một ứng dụng khác xác định thì
chúng thiết lập một nối kết và đa dữ liệu vào và ra trên nối kết này. Đây là cách
giống nh trong cuộc gọi điện thoại. Nếu bạn muốn nói với một ngời, một nối kết
đợc thiết lập khi ta quay số và có đáp ứng trả lời của ngời phía đầu bên kia. Bạn
sẽ truyền và nhận thông tin với ngời đó thông qua đờng điện thoại. Giống nh
một công ty điện thoại, TCP bảo đảm dữ liệu đợc gửi tới điểm nhận và nhận lại
một thông báo trả lời từ điểm nhận, nếu không một thông báo lỗi sẽ xuất hiện.
TCP cung cấp kênh giao tiếp điểm nối điểm cho mỗi ứng dụng có yêu cầu về
giao tiếp. Hypertext Trasform Protocol (HTTP), File Transfer
Protocol (FTP), và Telnet là những mô hình dành cho các ứng dụng khi nó
yêu cầu một kênh giao tiếp.
UDP
Giao thức UDP cung cấp kiểu giao tiếp không đảm bảo giữa hai ứng dụng
trên mạng. UDP không sử dụng cách nối kết trên cơ sở của TCP. Hơn nữa nó đa
các gói dữ liệu độc lập, gọi là datagram, từ một ứng dụng này tới một ứng dụng
khác. Gửi gói dữ liệu thì giống nh gửi một bức th thông qua các dịch vụ gửi th:

việc phân phát là không quan trọng và không bảo đảm; mỗi bản tin thì độc lập
với các bản tin khác.
PORTS
Nói một cách tổng quát máy tính đợc xem là một phần cứng vật lý nối với
mạng. Tất cả dữ liệu dành cho một máy tính đợc đa tới thông qua nối kết. Tuy
nhiên dữ liệu có thể bị dùng cho các ứng dụng khác nhau chạy trên máy tính đó.
Vậy làm thế nào một máy tính biết đợc ứng dụng nào nhận dữ liệu gửi đến. Câu
trả lời là thông qua các ports.
Dữ liệu truyền trên mạng có kèm theo một thông tin địa chỉ xác định máy
tính và số hiệu cổng mà nó đợc chỉ định tới. Máy tính đợc định danh bởi địa chỉ
IP 32 bit. Cổng đợc định danh bằng địa chỉ 16 bit, qua đó TCP và UDP sử dụng
để phân phát dữ liệu cho từng ứng dụng tơng ứng.


18
Trong kiểu nối kết cơ sở nh TCP thì một ứng dụng của server ràng buộc với
một socket để xác định số hiệu của cổng. Điều này có hiệu quả trong việc đăng
kí với server về hệ thống lu tất cả dữ liệu dành riêng cho cổng đó. Một máy con
client sẽ gặp server tại cổng, xem minh hoạ trên hình 2.2.
Hình 2.2
Trên cơ sở giao tiếp gói kiểu UDP, các gói dữ liệu có kèm theo số hiệu cổng
để tạo ra kết nối, nh trên hình 2.3. Số hiệu cổng thay đổi từ 0 tới 65535 bởi nó đ-
ợc đánh số 16 bit. Số cổng nằm trong khoảng 0 tới 1023. Chúng đợc dành cho
các dịch vụ thông thờng nh HTML hay FTP và một số các dịch vụ khác.
Hình 2.3
2.2 Lớp mạng trong JDK
Dựa vào các lớp trong gói java.net các chơng trình có thể sử dụng giao thức
TCP hay UDP để giao tiếp thông qua mạng. Các lớp URL, URLConnection,
Socket, Server-Socket đều sử dụng giao thức TCP trên mạng. Các lớp
DatagramPacket, DatagramSocket và MulticastSocket thì sử dụng giao thức

UDP.
2.2.1 - Thao tác với URL
URL là từ viết tắt cho Uniform Resource Locator. Nó là một sự tham
chiếu (một địa chỉ) tới một tài nguyên trên mạng Internet. Bạn cung cấp URL
cho các Web browser a thích sao cho nó có thể định vị các file trên mạng theo
cùng cách mà ta đề địa chỉ trên một bức th sau đó gửi tới các trạm bu điện để
chuyển th đi.


19
Các chơng trình Java có thể tham gia vào các hoạt động trên mạng đồng thời
cũng có thể sử dụng URL để tìm kiếm tài nguyên mà chúng muốn truy cập tới.
Chơng trình java sử dụng các lớp nằm trong gói java.net để đa ra các địa chỉ
URL.
URL là gì ?
Nếu ai đã từng lớt qua Web, thì có thể không ngại khi nghe nói tới thuật ngữ
URL và sử dụng URLs để truy cập các trang HTML trên Web.
Không phải là dễ dàng để hiểu về URL nh tên của một file trên Work Wide
Web bởi vì hâù hết URL đều tìm đến một file nào đó trên một vài máy trong
mạng. Tuy nhiên hãy nhớ rằng URL cũng có thể trỏ tới các tài nguyên khác trên
mạng, giống nh cơ sở dữ liệu Querier hay các lệnh.
Ví dụ một địa chỉ Web site host cung cấp phần mềm Java của hãng Sun
Microsystem có dạng nh sau:

Tất cả các URL đều có hai thành phần :
Nhận dạng giao thức (protocol identifier)
Tên tài nguyên (resource name)
Chú ý rằng khai báo giao thức và tên tài nguyên phải cách nhau một dấu hai
chấm và hai dấu gạch chéo phải. Khai báo giao thức chỉ ra tên của giao thức đợc
sử dụng để tìm kiếm tài nguyên. Ví dụ sử dụng giao thức chuyển đổi siêu văn

bản (HTTP), là một cách điển hình để cung cấp các tài liệu hypertext. HTTP là
một trong số rất nhiều giao thức đợc sử dụng để truy nhập tới các kiểu tài nguyên
khác nhau trên mạng. Một số các tài nguyên khác nh File trasfer Protocol (FTP),
Gopher, File, và các kiểu mới khác.
Tên tài nguyên là địa chỉ chỉ tới tài nguyên, địa chỉ này phải đầy đủ. Dạng
của tên tài nguyên dựa vào giao thức đợc sử dụng, nhng không phải đối với nhiều
giao thức, bao gồm cả HTTP, tên tài nguyên chứa một hay nhiều các thành phần
khác nhau nh trong bảng 23 dới đây.
Host Name the name of the machine on which the resource
lives
File name The pathname to the file on the machine
Port Number The port number to which to connect ( typical
optional)
Reference A reference to a named anchor within a
resource that usually indentifies a specific
location within a file (tipically optional).


20
Bảng 23
Đối với nhiều giao thức, tên host và tên file cùng đợc yêu cầu, trong khi số
cổng và tham chiếu thì không đợc chọn. Ví dụ, tên tài nguyên cho một HTTP
URL phải xác định trên một máy chủ và đờng dẫn tới tài liệu trên máy đó; nó
cũng có thể xác định một tên của host và một chỉ dẫn tận cùng cho tên file có
dạng /index.html.
Tạo một URL
Cách dễ dàng nhất tạo ra một đối tợng URL là từ một chuỗi các kí tự do ngời
dùng nhập vào để tạo nên một địa chỉ URL. Cách này cho phép những ngời khác
cũng có thể sử dụng URL. Ví dụ, URL cho Gamelan site nằm trong th mục
tài nguyên Java có cấu trúc nh sau:

/>trong chơng trình Java bạn sử dụng chuỗi String chứa dòng văn bản để tạo ra
đối tợng URL:
URL gamelan = new URL(
Tạo liên kết cho một URL tới URL khác
Một relative URL chứa đủ các thông tin tiếp cận tới tài nguyên quan hệ với
một URL khác. Quan hệ URL thờng đợc sử dụng trong các file HTML. Ví dụ giả
sử ta viết một file HTML có tên là JoesHomePage.html. Trang này chứa các
nối kết tới những trang khác, PicturesOfMe.html và MyKids.html trong cùng
th mục và trên cùng một máy. Sự kết nối này đợc viết nh sau:
<A HREF=PicturesOfMy.html>Pictures of Me</A>
<A HREF=MyKids.html>Pictures of Kids</A>
Trong chơng trình java bạn tạo ra một đối tợng URL từ các mối quan hệ xác
định. Ví dụ giả sử bạn biết hai URL của Gamelan site:
/> /> Ta tạo ra đối tợng quan hệ với các trang này trên URL cơ sở chung
giống nh sau:
URL gamelan = new URL( /> URL gameGames = new URL(gamelan, Gamelan.game.html);
URL gamelanNetWork = new URL(gamelan, Gamelan.net.html);
Các mã lệnh đơn giản ở trên đợc sử dụng nhằm cho phép bạn tạo nên các
URL mới. Phần đối số là một chuỗi xác định tên tài nguyên cần đợc liên hệ tới.
Nếu baseURL là null thì cấu trúc sẽ thực hiện relativeURL nh một xác định URL
thuần tuý và sau đó bỏ qua baseURL.
Cấu trúc nh vậy cũng đợc sử dụng để tạo các đối tợng URL cho lu giữ tên
(còn gọi là các reference) trong một file. Ví dụ file Gamelan.net có một tên
lu giữ là Bottom nằm tại đầu file, ta có thể sử dụng cấu trúc quan hệ URL để tạo
một đối tợng URL dành cho nó nh dới đây.


21
URL gamelanNetworkBottom = new URL(gamelanNetwork, "#BOTTOM");
Những cấu trúc URL khác

Lớp URL cung cấp thêm hai constructor để tạo ra một đối tợng URL. Các
constructor này có hiệu quả khi ta làm việc với các giao thức có sử dụng URL
nh kiểu HTTP URL, constructor chứa tên của host, tên file, số hiệu cổng,và các
thành phần tham chiếu khác trong phần tên tài nguyên của URL. Hai constructor
cho phép ta không cần phải biết đầy đủ tên đờng dẫn tới tài nguyên mà chỉ cần
biết tới phần mở rộng của nó.
Ví dụ ta thiết kế một bảng panel cho browser giống nh bảng panel của file
browser, nhằm cho phép ngời sử dụng chọn giao thức, tên host, số hiệu cổng và
tên file mà họ yêu cầu. Bạn có thể cấu trúc một URL từ các thàh phần của panel.
Constructor đầu tiên tạo ra một đối tợng URL từ giao thức, tên host, tên file.
Câu lệnh sau đây tạo ra một URL tham chiếu tới file Gamelan.net.html tại
Gamelan site:
new URL("httl",,"/pages/Gamelan.net.html");
điều này tơng đơng với:
new URL( );
Đối số đầu tiên là giao thức, đối số thứ hai là tên host và cuối cùng là đờng
dẫn tới file. Chú ý rằng tên file chứa một dấu gạch chéo ngợc đặt trớc nó.
Constructor cuối cùng cộng thêm số hiệu cổng vào danh sách các đối số đã sử
dụng trong constructor trớc.
URL gamelan = new URL("http","www.gamelan.com".,80
,"pages/Gamelan.network.html");
Câu lệnh này tạo ra một đối tợng URL nh sau:
:80/pages/Gamelan.network.html
MalfformedURLException
Một trong bốn constructor URL đều đa vào một MalformedURLException
nếu đối số của constructor là trỏ giá trị null hoặc constructor không biết giao
thức sử dụng là gì. Thông thờng muốn bắt buộc thực hiện nối kết bằng
constructor URL của bạn thì hãy sử dụng câu lệnh try-catch có dạng nh sau:
try {
URL myURL = new URL( )

}catch(MalformedURLException e){

//Exception hander code here

}
Phân tích một URL
Lớp URL cung cấp một số các phơng thức cho phép "hỏi thăm" các đối tợng
URL. Chúng ta có thể nhận đợc giao thức, tên host, số hiệu cổng, và tên file từ
một đối tợng URL bằng việc sử dụng các phơng thức truy cập sau:
getprotocol trả lại khai báo kiểu giao thức của URL.
getHost trả lại thành phần tên Host của URL.


22
GetPort trả lại số nguyên là số hiệu cổng của URL. Nếu cổng không
đợc đặt thì trả về giá trị -1.
getFile trả về thành phần tên file của URL.
getRef trả về thành phần reference của URL.
Nh vậy có thể sử dụng các phơng thức kiểu getXXX để nhận đợc các thông
tin về URL mà ta đang sử dụng để tạo ra một đối tợng URL. Lớp URL cùng với
các phơng thức của nó cho phép tự do phân tích lại một lần nữa cấu trúc này. ở
trên đã tạo một đối tợng URL và gọi tới các phơng thức truy cập để lấy những
thông tin cần thiết. Chơng trình sau đây tạo ra một dạng URL từ chuỗi khai báo
và sau đó sử dụng các phơng thức truy cập của đối tợng này để phân tích URL đã
tạo ra.
import java.net.*;
import java.io.*
public class ParseURL {
public static void main(String[] args) throws Exception{
URL aURL=new URL(":80/docs/"+

"books/tutorial/intro.html#"+
"DOWNLOADING");
System.out.println("protocol="+aURL.getProtocol());
System.out.println("host =" +aURL.getHost());
System.out.println("filename =" +aURL.getFile());
System.out.println("port =" +aURL.getPort));
System.out.println("ref =" +aURL.getRef());
}
}
Đọc trực tiếp từ một URL
Sau khi đã thành công trong việc tạo ra một đối tợng URL, ta có thể gọi tới
phơng thức openStream của đối tợng để nhận đợc luồng dữ liệu biểu thị nội
dụng của nó. Việc đọc nội dung của một URL dễ dàng nh việc đọc một luồng dữ
liệu vào.
Chơng trình java ngắn dới đây sử dụng phơng thức openStream để nhận đợc
luồng dữ liệu vào trên địa chỉ . Nếu sau khi đã mở một
BufferedReader trên một luồng dữ liệu thì đọc từ BufferReader với cách làm nh
vậy ta có thể đọc đợc nội dung một URL bất kì.
import java.net.*;
import java.io.*;
public class URLReader {
public static void main(String[] args) throws Exception {
URL yahoo = new URL();
BufferedReader in = new BufferedReader(
new InputStreamReader(
yahoo.openStream()));
String inputLine;
while((inputLine = in.readLine())!=null)
System.out.println(inputLine);
in.close();

} }
Khi chạy chơng trình chúng ta sẽ thấy, hiện lên cửa sổ lệnh, các lệnh HTML
và văn bản trên file HTML định vị tại địa chỉ


23
Kết nối tới một URL
Khi đã tạo xong một đối tợng URL ta có thể dùng phơng thức open
Connection để kết nối với nó. Khi nối kết với một URL, bạn khởi tạo một giao
tiếp kết nối giữa chơng trình Java với URL thông qua mạng. Ví dụ ta có thể kết
nối tới site của Yahoo bởi các lệnh sau:
try {
URL yahoo = new URL ();
URL Connection = yahoo.openConnection();
} catch (MalformedURLException e) {//new URL failed

} catch (IOException e) { // openConnection failed

}
Đọc và ghi một đối tợng URLConnection
Đọc từ một nối kết
Chơng trình sau thực hiện cùng một chức năng nh chơng trình URLReader ở
trên. Tuy nhiên nó thực hiện một cách trực tiếp hơn từ URL. Các chữ in đậm là
sự khác nhau giữa hai chơng trình.
import java.net.*;
import java.io.*;
public class URLConnectionReader {
public static void main(String[] args) throw Exception
{
URL yahoo = new URL( /> URLConnection yc = yahoo.openConnection();

BuffereReader in = new BufferReader(
New InputStreamReader(
yc.getInputStream()));
String inputLine;
while((inputLine = in.readLine())!=null)
System.out.println(inputLine);
in.close();
}
}
Viết một URLConnection
Nhiều trang HTML chứa các dạng forms- trờng văn bản và các đối tợng GUI
khác cho phép nhập dữ liệu và gửi tới các server. Sau khi nhập vào các thông tin
yêu cầu cần thiết và khởi tạo nó bằng cách nhấn chuột lên một nút, thì Web
browser sẽ ghi dữ liệu lên URL thông qua mạng. Tại đầu cuối kia, một bản cgi-
bin, thờng nằm trên server sẽ lu lại các dữ liệu của bạn, xử lý nó và gửi cho bạn
các đáp ứng dới dạng một trang Web mới.
Rất nhiều bản cgi-bin sử dụng phơng thức potst (POST METHOD) để đọc dữ
liệu trên các máy con. Vì thế ghi vào một URL đợc gọi là posting to a URL. Khi
lập trình, java cũng cho phép tác động tới các bản cgi-bin. Điều này đợc thực
hiện qua các bớc sau:
1. Tạo ra một URL
2. Mở một nối kết tới URL


24
3. Thiết lập khả năng đa dữ liệu ra trên URLConnection
4. Nhận luồng dữ liệu ra từ nối kết đó. luồng dữ liệu ra đợc nối kết với luồng
vào cơ bản của bản cgi-bin trên máy chủ server.
5. Ghi luồng dữ liệu ra.
6. Đóng luồng dữ liệu vào.

2.2.2 Socket
URL và URLConnection cung cấp một kĩ thuật ở mức cao để truy nhập tới các
tài nguyên mạng. Đôi khi chơng trình của chúng ta yêu cầu mức giao tiếp mạng
ở cấp thấp hơn ví dụ nh muốn viết về một ứng dụng client-server.
Giao thức TCP cung cấp kênh giao tiếp điểm nối điểm đáng tin cho các ứng
dụng client-server trên mạng và cho phép giao tiếp với các máy khác. Để giao
tiếp thông qua TCP, một chơng trình của client và server thiết lập nên một nối
kết tới nhau. Mỗi một chơng trình gắn liền với một socket xác định cho đến khi
kết thúc giao tiếp. Muốn giao tiếp đợc client và server phải đọc và ghi lên một
socket đã đợc quy định trớc.
Socket là gì ?
Thông thờng một server chạy trên một máy tính xác định thì có một socket
quy định cho một số hiệu cổng xác định. Server sẽ chờ và nghe socket tơng ứng
với client đang yêu cầu nối kết.
Bên phía client: client biết tên hostname của máy mà server đang chạy đồng
thời biết số hiệu cổng mà server đợc nối. Để tạo một yêu cầu nối kết, client cố
gắng hẹn gặp với server trên cổng và máy của server.
Hình 2.4
Bên phía server: nếu nối kết đợc chấp nhận, một socket cũng đợc tạo ra và
client sử dụng socket này để giao tiếp với server. Chú ý rằng socket bên client
không đợc quy định số hiệu cổng sử dụng để gặp server. Nhng tất nhiên là client
đợc ấn định một số hiệu cổng địa phơng trên máy mà client đang chạy.


25

×