Distributed Computing in Java Hướng dẫn chungMô hình Ứng dụng hướng sự kiện- Event-based Program Sự kiện- Event, còn gọi là biến cố: Một tình huống xẩy ra, thí dụ: người dùng gõ thêm một
Trang 1Distributed Computing in Java Hướng dẫn chung
Mô hình Ứng dụng hướng sự kiện- Event-based Program
Sự kiện- Event, còn gọi là biến cố: Một tình huống xẩy ra, thí dụ: người dùng gõ thêm một ký tự vào một textbox làm nội dung trong textbox này bị đổi, user kích vào một nút lệnh để chọn một tác vụ
Event object: Chứa thông tin về một biến cố đã xẩy ra
Thí dụ về sự kiện chuột : vị trí kích chuột (x,y), đối tượng bị chuột đè lên và kích vào, số lần kích
mà người dùng đã bấm (1,2,3 lần kích), phím bị kích (trái,giữa, phải)…
Các ứng dụng này có được khi người lập trình sử dụng các ngôn ngữ Visual C++, Visual Basic, Java, C Sharp- Những ngôn ngữ mạnh hiện nay
Ứng dụng loại này là các ứng dụng có GUI (Graphical User Interface) Cơ chế vận hành (frame work) của loại ứng dụng này như sau:
1 Khi chạy ứng dụng, GUI được xuất ra để user tương tác.
2 Lặp
- Chờ user tương tác với GUI để có đối tượng sự kiện
- Xử lý sự kiện
- Xuất kết qủa xử lý lên GUI
Khi user còn tương tác.
Trang 2Như vậy, các bước lập trình ứng dụng như sau:
1- Viết code tạo GUI (nhiều công cụ có công cụ trực quan để user tạo GUI)
2- Dự kiến các sự kiện cần được quản lý.
3- Viết code xử lý từng sự kiện.
4- Biên dịch Việc đưa code quản lý sự kiện vào ứng dụng do trình biên dịch thực hiện tự động.
Thiết kế GUI với NetBeans
1) Tạo Project: General/ Java Application – Đặt tên và chọn thư mục
2) Thêm 1 file: New File/ Java GUI Forms/ Jframe Form/ Đặt tên
NetBeans sẽ tự động tạo cho chúng ta một Form để thiết kế GUI
3) Chọn cách bố trí các phần tử (Kích phải chuột vào form, nênchọn Null Layout)
4) Đưa vào 1 phần tử
Trang 35) Đặt tên biến
Cách đặt tên nên dùng: Thêm tiếp đầu ngữ:
txt cho textbox, textarea
TextArea cho address : txtArea Radiobutton cho giới tính male: rbMale Radiobutton cho giới tính female: rbFemale
6)Thiết lập thuộc tính
Đặt kích thước cửa sổ: Mở code, gọi hành vi thiết lập kích thước cửa sổ vào trong constructor, dưới lời gọi nitComponents Nhờ tác vụ này, khi chương trình được chạy, cửa sổ sẽ có ngay kjích thước ban đầu Nếu không làm điều này, cửa sổ chỉ có tiêu đề, user phải kéo cửa sổ cho lớn ra.
Trang 47) Viết code quản lý sự kiện
Assigment 1: Introduction to Swimg
Assignment
Tạo form nhập thông tin về sinh viên theo hình thức ở hình dưới
Nút Validate:
Sẽ kiểm tra tính hợp lệ của dữ liệu nhập (mọi field đề phải có dữ liệu)
Nút Reset: Xóa trống các ô nhập liệu để user có thể nhập lại thông tin.
Trang 5Một số gợi ý
- Ấn định tiêu đề cho cửa sổ: Chọn form/ Properties/ Title
- Vẽ khung trên GUI: Thêm 1 JPanel/ chọn JPanel này/ Properties/ Border/ Kích nút bên phải của sổ Properties/ chọn loại border.
- Tạo nhóm cho 2 Radiobutton:
o Trước khi đưa JradioButton vào Form, hãy thêm 1 JButtonGroup vào form.
o Thêm 2 JRadioButton vào form, vào Properties của các radio button này, cho thuộc tính ButtonGroup là JbuttonGroup vừa đưa vào ở bước trên.
- Thêm chuỗi vào JComboBox: Chọn JComboBox, vào properties/ Chọn model/ Kích nút bên
phải của sổ Properties để sửa nội dung.
- Truy xuất thuộc tính text của textbox, textarea:
this.txtName.setText(“”); // xóa trống ô name
this.txtAddress.setText(“123 Le Loi”); // sửa nội dung textarea address
string s= txtAddress.getText(); // lấy nội dung của text area address đưa vào biến s
Assignment 2: Swing Components and DialogBox
Trang 6Mặc định, nhãn sẽ xuất cùng với JSlider là số Muốn xuất chữ, chúng ta cần phải tạo một bảng ánh xạ các
số với các JLabel Đoạn code sau (đặt trong constructor) sẽ giúp xuất chữ cùng với JSlider:
Gợi ý
Dùng các JSlider
- Can thiệp các thuộc tính: minimum, maximum, paintLabel, paintTick, paintTrack, majorTickSpacing, value
Trang 7Assignment 3: Layout Managers
Trường kinh doanh Norman là một học viện hàng đầu đào tạo sau đại học về quản trị kinh doanh MỖi năm có hơn
1000 sinh viên đăng ký vào các khóa học
Viết một chương trình Java giúp ghi nhận thông tin về sinh viên như GUI dưới đây
Nút Reset: Xóa trống các ô text field.
Nút Save: Kiểm tra buộc nhập các textfield Một thông báo sẽ xuất ra phù hợp tùy thuộc vào dữ liệu hợp
lệ hay không.
Nút Exit: thoát ứng dụng
Gợi ý
Kiểm tra buộc nhập cho 1 textfield bằng 1 trong 2 cách:
(1) Dựa vào độ dài chuỗi
Trang 8Assignment 4: Swing Menu Components
Viết chương trình chọn mầu cho học sinh lớp 5
Trang 9Assignment 5: Swing Advanced Controls
- Muốn nút lệnh không có chữ: xóa property
text
- Chọn mầu nền cho nút lệnh: chọn thuộc tính
background
- Chọn ảnh cho nút lệnh: thuộc tính icon/
Image Source Type = File/ chọn file.jpg/.gif
- Muốn lấy mầu nền của nút:
java.awt.Color color= btn.getBackGround();
- Cần 1 biến boolean back=true; để quản lý tô mầu
ga đến (to), loại ghế (option)
Dữ liệu liên quan đến bài toán này ( ứng với các lớp phải xây dựng) bao gồm:
Thông tin về 1 chuyến bay FlightInfo (from,to,flightName,option,price)
Thông tin về các chuyến bay FlightListSau đó tạo GUI để tương tác
Trang 10Lớp mô tả cho một chuyến bay:
Trang 11Lớp mô tả cho 1 danh sách chuyến bay
Trang 12Lớp tạo GUI
Tên các đối tượng trên form:
Trang 13Component property Trị
Frame title Flight Reservation
layout null
rFirstClass font size=10
buttonGroup buttonGroup1rBusiness font size=10
buttonGroup buttonGroup1rExecutive font size=10
buttonGroup buttonGroup1lstResults font size=10
Dữ liệu cần có
Danh sách các chuyến bay L
Mô hình dữ liệu cho listbox lstResults
Các sự kiện cần quản lý
User kích chọn 1 ga đi actionEvent
User kích chọn nút Exit actionEvent
User kích chọn nút Search actionEvent
Tác vụ thêm
Khởi tạo danh sách các chuyến bay
Xuất kết qủa tìm kiếm vào listbox lstResults
Trang 14Assignment 6: Internationalization
Để làm bài này, cần thay đổi font của System về font Unicode cho thanh tiều đề của cửa sổ như sau:
(1) Kích phải màn hình Desktop/ Properties.
(2) Chọn thẻ Appearance
(3) Kích nút Advance, cửa sổ Advanced Appearance xuất hiện
(4) Chọn Item: Active Title Bar
(5) Chọn Font: Tahoma
Trang 15Để có giao diện đẹp hơn, sửa GUI như sau:
Viết ứng dụng Java cho một công ty của Việt Nam (thay cho Pháp) giúp đổi tiền
Trang 16Trong GUI trên, có 7 nội dung cần đổi và các tập tin properties phải phản ảnh 7 nội dung này
Các file cần có:
CurrencyInfo.java chứa khai báo lớp CurrencyInfo mô tả cho một loại tiền.
CurrencyList.java chứa khai báo lớp CurrencyList mô tả cho một danh sách các loại tiền.
Vietnamese_vn_VN.properties: chứa các khai báo tiêu đề cho GUI tiếng Việt.
English_us_US.properties: chứa các khai báo tiêu đề cho GUI tiếng Anh.
ConvertPrg.java: chứa lớp ConvertPrg là GUI của chương trình
Bước 1: Tạo Project Module_6
Bước 2: Tạo class mô tả cho thông tin tiền tệ
Mỗi loại tiền được mô tả bằng loại tiền (type), ký hiệu (symbol), và hệ số đổi một $US sang loại tiền này
Để tạo cơ chế so sánh tự động theo loại tiền (type) dùng trong lớp CurrencyList-danh sách các loại tiền, lớp
CurrencyInfo cần implement hai interface: Comparator và Comparatible
Trang 17Bước 3: Tạo tập tin CurrentList.java
Vì đặc điểm của các loại tiền trên thế giới là khác nhau Do vậy, để danh sách các loại tiền có khả năng tự động sắp xếp tên các loại tiền theo thứ tự từ điển (vì phần tử của danh sách là 1 loại tiền – lớp CurrencyInfo- đã cung cấp các hàm so sánh theo tên) thì danh sách các loại tiền nên là lớp con của lớp java.util.TreeSet
Bước 4: Tạo tập tin Vietnamese_vn_VN.properties
(New File/ Other/ Properties File/ Đặt tên, để trong thư mục build/classes)
Tham khảo một số mã Unicode
Một số mã Unicode cho tiếng Việt (tham khảo chức năng insert symbol trong MS Word hoặc Start/All
Programs/ Accessories/ System Tools/ Character Map):
á: 00E1 ư: 01B0 ơ: 01A1 ì: 00EC ề: 1EC1 Đ: 00D0 đ: 0111
Trang 18Bước 5: Tạo tập tin English_us_US.properties
Bước 6: Xây dựng lớp ConvertPrg cho chương trình đổi tiền Giao diện và tên các đối tượng trên giao diện:
Trang 21Assignment 7: Networking
biennial: niên hạn hai nămtamper: quấy nhiễuschool pricipal: hiệu trưởngsenior staff: thành viênTạo ứng dụng chạy trên mạng cho phép học sinh gửi nội dung một file trả lời về server dựa trên
IP của server
Tại ứng dụng server, khi user kích nút Start, user được yêu cầu nhập vị trí cho việc lưu file do client chuyển đến Khi server nhận được file từ client, trên textfield sẽ xuất hiện dòng thông báo là client đã gửi file
Trang 22Sử dụng TCP Socket
TCP socket truyền thông giữ đường truyền dạng, dữ liệu truyền thông là các chuỗi ký tự Do vậy, cần định ra một cơ chế giao tiếp gọi là protocol giữa hai máy Trong bài này, dùng chuỗi “Bye.” để đánh dấu chấm dứt giao tiếp.
Khi lập trình Socket với ứng dụng có GUI, vì không thể biết lúc nào client giao tiếp với server nên ta cần
định thời quét tìm client bằng cách sử dụng lớp javax.swing.Timer Cứ đúng thời hạn đã ấn định, một sự
kiện ActionEvent sẽ xẩy ra và chúng ta có thể bẫy sự kiện này để xử lý.
Cú pháp tạo đối tượng timer như sau:
import javax.swing.*;
import java.awt.event.*
……
int delayTime=500;
ActionListener taskPerformer = new ActionListener() // package java.awt.event
{ public void actionPerformed(ActionEvent evt)
{ processingConnection(); // gọi tác vụ xử lý khi đúng thời điểm
}
};
Timer tm=new Timer(delayTime, taskPerformer);
tm.start();
Trang 23Cấu trúc của ứng dụng
ServerForm.java
Giao diện:
Các ảnh do bạn tự chọn hoặc không có ảnh cũng được Lớp ServerForm là giao diện chứa một Socker Server tại mỗi thời điểm sẽ chấp nhận một client truyền một nội dung về server và người dùng bên server sẽ lưu dữ liệu này vào một tập tin với tên tập tin
do user chỉ định.
Trang 27Giao diện
Client có thể kết nối với server nếu client biết IP và port của server Sau khi nhập vào tên tập tin cần truyền và kích nút Send, nội dung tập tin sẽ được truyền sang server Server nhận dữ liệu
và truyền lại thông báo đã nhận
dữ liệu.
Trang 29Assignment 8 : Remote Method Invocation
Trang 30Cấu trúc nên có của ứng dụng:
Trang 31Các bước xây dựng ứng dụng:
Bước 1: Tạo Remote interface, biên dịch interface này
Vì giao tiếp giữa client và server chỉ là kiểm tra cặp dữ liệu (username, password) do vậy interface này chỉ có một hành vi với cho tiết sau:
Kiểu trả trị: boolean vì cho kết quả là đúng hoặc sai.
Tên hành vi: check
Tham số : hai String
Trang 32Trong lớp này, cần khai báo IP của máy chạy chương trình server này (IP của máy cá nhân là “127.0.0.1”
và tên dịch vụ - thí dụ “checker” Lớp này chứa một danh sách ( tên users) gồm các cặp
<username,password> Thông thường các username phải khác nhau Do vậy, danh sách này nên chọn là một HashMap <String,String> để việc tìm kiếm được tiến hành nhanh chóng.
Trong constructor của lớp này, việc đọc file được tiến hành để nạp nội dung file dữ liệu vào biến users.
Để lớp này có khả năng kiểm tra việc đăng nhập từ xa, lớp này phải implements interface đã được hiện thực ở trên.
Trong hành vi main, một đối tựơng thuộc lớp này cần phải được tạo ra và đăng ký tên dịch vụ với server
quản lý các dịch vụ Do vậy, trình rmiregister.exe cần phải được gọi thông qua đối tượng thuộc lớp
Runtime.
Trang 34Bước 4: Tạo tập tin MakeStub.bat, chạy tập tin này để có stub class Bước 5: Tạo Client class
GUI
Biến thêm
Quản lý sự kiện khi user kích nút Reset
Xóa trống 2 text fields
Quản lý sự kiện khi user kích nút Submit
Trang 35Chạy ứng dụng
- Tạo runServer.bat và runClient.bat
- Chạy runServer.bat trước rồi chạy runClient.bat sau.
Kết qủa
Server
Client
Assignment 9: JavaMail
Trang 36Tạo một ứng dụng Java sử dụng Java Mail cho phép user gửi email đến một số người, cho phép đính kèm
các tập tin Người gửi sẽ phải nhập địa chỉ địa chỉ của mình vào ơ From, địa chỉ các bác sĩ vào ô To phân cách các địa chỉ bằng ‘;’ hoặc ‘,’ Người gửi có thể nhập Subject và Content vào các ô tương ứng Nếu người dùng muốn attach một tập tin thì kích nút Attach Khi user kích nút Send, thư này sẽ được gửi đi Tình trạng thành công/ thất bại của quá trình gửi được thông báo cho người dùng Chú ý: Để chạy
chương trình này, user phải kết nối internet.
Xem bài mẫu trong đĩa CD giáo trình môn học
Trang 37Bài này nên được phát triển theo hướng linh động hóa để cho phép người dùng:
- Nhập vào mail server host.
- Port của mail server
- Tùy biến mail server có sử dụng cơ chế Authentication hay không.
- Địa chỉ người gửi (from)
- Các địa chỉ người nhận : TO, CC, BCC
- Chủ đề (subject)
- Các tập tin cần attach
- Thân (body) của thư.
( Tham khảo GUI dưới đây)
Kiến trúc của ứng dụng
Trang 38MyAuthenticator.java : Lớp mô tả cho một account của một mail server có sử dụng cơ chế
authentication.
SendingMail.java : Lớp mô tả cho ứng dụng gửi thư.
Bước 1: Tạo project
Bước 2: Add thư viện Java Mail
Trang 39Bước 2 : Copy 2 tập tin jar này vào thư mục lib/ext của JRE để máy ảo sử dụng các lớp dùng trong việc
gửi thư.
Bước 2: Thêm file: MyAuthenticator.java
Trang 40Bước 3 : Thêm file SendingMail.java
Trang 41Import các lớp
Trang 42Khi user kích checkbox Account Request
Khi user kích nút Select File
Hành vi kiểm tra host, port, from
Trang 43Khi user kích nút Send
Trang 45
Bước 4: Biên dịch
Bước 5 : Đóng gói để có file.jar
Kết qủa được NetBeans để trong thư mục dist (distribution- phân phối – User cần chép nội dung thư mục
này để chạy ứng dụng)
Bước 6: Tạo tập tin bat để trong thư mục dist
Bước 7 : Chạy chương trình : Kích đôi vào tập tin bat
Trang 46Bài đọc thêm về các properties khi gửi thư
Đọc trong thư mục NetBeans
Đọc ở cuối tập tin
Có khai báo các Keys của properties khi gửi thư thông thường
Package com.sun.mail.smtp
mail.smtp.user String Default user name for SMTP
mail.smtp.host String The SMTP server to connect to
mail.smtp.port int The SMTP server port to connect to, if the connect() method doesn't
explicitly specify one Defaults to 25
mail.smtp.connectiontimeout int Socket connection timeout value in milliseconds Default is infinite timeout.mail.smtp.timeout int Socket I/O timeout value in milliseconds Default is infinite timeout
mail.smtp.localaddress String
Local address (host name) to bind to when creating the SMTP socket Defaults to the address picked by the Socket class Should not normally need to be set, but useful with multi-homed hosts where it's important to pick a particular local address to bind to
Trang 47mail.smtp.localport int Local port number to bind to when creating the SMTP socket Defaults to the port number picked by the Socket class
If false, do not attempt to sign on with the EHLO command Defaults to true Normally failure of the EHLO command will fallback to the HELO command; this property exists only for servers that don't fail EHLO properly or don't implement EHLO properly
mail.smtp.auth boolean If true, attempt to authenticate the user using the AUTH command
Defaults to false
mail.smtp.submitter String
The submitter to use in the AUTH tag in the MAIL FROM command Typically used by a mail relay to pass along information about the original submitter of the message See also the setSubmitter method
of SMTPMessage Mail clients typically do not use this
mail.smtp.dsn.notify String
The NOTIFY option to the RCPT command Either NEVER, or some combination of SUCCESS, FAILURE, and DELAY (separated by commas)
mail.smtp.dsn.ret String The RET option to the MAIL command Either FULL or HDRS
mail.smtp.allow8bitmime boolean
If set to true, and the server supports the 8BITMIME extension, text parts
of messages that use the "quoted-printable" or "base64" encodings are converted to use "8bit" encoding if they follow the RFC2045 rules for 8bit text
mail.smtp.sendpartial boolean
If set to true, and a message has some valid and some invalid addresses, send the message anyway, reporting the partial failure with a
SendFailedException If set to false (the default), the message is not sent
to any of the recipients if there is an invalid recipient address
mail.smtp.sasl.realm String The realm to use with DIGEST-MD5 authentication
mail.smtp.quitwait boolean
If set to false, the QUIT command is sent and the connection is immediately closed If set to true (the default), causes the transport to wait for the response to the QUIT command
mail.smtp.reportsuccess boolean
If set to true, causes the transport to include an SMTPAddressSucceededException for each address that is successful Note also that this will cause a SendFailedException to
be thrown from the sendMessage method of SMTPTransport even
if all addresses were correct and the message was sent successfully mail.smtp.socketFactory.class String
If set, specifies the name of a class that implements the javax.net.SocketFactory interface This class will be used to create SMTP sockets
mail.smtp.socketFactory.fallback boolean
If set to true, failure to create a socket using the specified socket factory class will cause the socket to be created using the java.net.Socket class Defaults to true
mail.smtp.socketFactory.port int Specifies the port to connect to when using the specified socket factory If not set, the default port will be used mail.smtp.mailextension String Extension string to append to the MAIL command The extension string
can be used to specify standard SMTP service extensions as well as vendor-specific extensions Typically the application should use the SMTPTransport method supportsExtension to verify that the