Giáo trình Công nghệ Java
Mục đích
Nội dung tập trung trình bày các vấn đề chính về ngôn ngữ lập trình Java:
Lịch sử ra đời và phát triển của Java
Kiến trúc tổng quát một chương trình xây dựng trên Java
Các đặc điểm của Java, khái niệm máy ảo.
Cấu trúc một chương trình Java đơn giản, cách xây dựng, dịch, thực thi một chương
trình Java.
1.1. Lịch sử ra đời và phát triển của Java
Năm 1991, một nhóm kỹ sư của Sun Microsystems muốn lập trình điều khiển
các thiết bị điện tử như tivi, máy giặt Ban đầu, định dùng C và C++ nhưng trình biên
dịch C/C++ phụ thuộc vào từng loại CPU. Do đó, họ đã bắt tay vào xây dựng một ngôn
ngữ chạy nhanh, gọn, hiệu quả, độc lập thiết bị và ngôn ngữ “Oak” ra đời vào năm
1995, tương tự như C++ nhưng loại bỏ một số tính năng nguy hiểm của C++ và có khả
năng chạy trên nhiều nền phần cứng khác nhau. Cùng lúc đó world wide web bắt đầu
phát triển và Sun thấy được tiềm năng của ngôn ngữ Oak nên đã đầu tư cải tiến và phát
triển.
Ngôn ngữ lập trình Java được Sun Microsystems giới thiệu vào tháng 6 năm
1995 và nhanh chóng trở thành một ngôn ngữ lập trình của các lập trình viên chuyên
nghiệp. Java được xây dựng dựa trên nền tảng của C và C++, Java sử dụng cú pháp của
C và đặc trưng hướng đối tượng của C++. Java là ngôn ngữ vừa biên dịch vừa thông
dịch. Đầu tiên mã nguồn được biên dịch thành dạng bytecode. Sau đó được thực thi trên
từng loại máy nhờ trình thông dịch. Mục tiêu của các nhà thiết kế Java là cho phép
người lập trình viết chương trình một lần nhưng có thể chạy trên các nền phần cứng
khác nhau.
Ngày nay, Java được sử dụng rộng rãi, không chỉ để viết ứng dụng trên máy cục
bộ hay trên mạng mà còn để xây dựng các trình điều khiển thiết bị di động, PDA,
1.2. Đặc trưng ngôn ngữ Java
Tính đơn giản
Ngôn ngữ lập trình Java loại bỏ các đặc trưng phức tạp của C và C++ như: Loại
bỏ thao tác con trỏ, thao tác định nghĩa chồng toán tử (operator overloading) , không
cho phép đa kế thừa (Multi-inheritance) mà sử dụng giao diện (interface), không sử
dụng lệnh “goto” cũng như file header (.h), loại bỏ cấu trúc “struct” và “union”.
Tính hướng đối tượng
Hướng đối tượng trong Java tương tự như C++ nhưng Java là một ngôn ngữ lập
trình hướng đối tượng hoàn toàn. Tất cả mọi thứ đề cập đến trong Java đều liên quan
đến các đối tượng được định nghĩa trước, thậm chí hàm chính của một chương trình viết11
bằng Java (hàm main) cũng phải đặt bên trong một lớp. Hướng đối tượng trong Java
không có tính đa kế thừa (multi inheritance) như trong C++ thay vào đó Java đưa ra
khái niệm interface hỗ trợ tính đa kế thừa.
Tính độc lập với phần cứng và hệ điều hành
Tính độc lập với phần cứng được hiểu theo nghĩa một chương trình Java, nếu
chạy đúng trên phần cứng của một họ máy nào đó thì cũng chạy đúng trên tất cả các họ
máy khác. Một chương trình chỉ chạy đúng trên một số họ máy cụ thể được gọi là phụ
thuộc vào phần cứng.
Tính độc lập với hệ điều hành được hiểu theo nghĩa một chương trình Java có thể
chạy được trên tất cả các hệ điều hành. Một chương trình chỉ chạy được trên một số hệ
điều hành được gọi là phụ thuộc hệ điều hành.
Các chương trình viết bằng Java có thể chạy trên hầu hết các hệ nền mà không
cần phải thay đổi gì, những người lập trình đặt cho nó một khẩu hiệu ‘viết một lần, chạy
mọi nơi’, điều này là không thể có với các ngôn ngữ lập trình khác.
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: Giáo trình Công nghệ Java
); } catch (Exception ex) { view.showMessage(ex.getStackT race().toString()); } return result; } } ClientRun.java package udp.client; public class ClientRun { public static void main(String[] args) { ClientView view = new ClientView(); ClientControl control = new ClientControl(view); view.setVisible(true); } } Các lớp phía server package udp.server; public class ServerView { public ServerView(){ } public void showMessage(String msg){ System.out.println(msg); } } ServerControl.java package udp.server; import java.io.ByteArrayInputStream; import j ava.io.ByteArrayOutputStream; 214 import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import udp.client.User; public class ServerControl { private ServerView view; private Connection con; private DatagramSocket myServer; private int serverPort = 5555; private DatagramPacket receivePacket = null; public ServerControl(ServerView view){ this.view = view; getDBConnection("usermanagement", "root", "12345678"); openServer(serverPort); view.showMessage("UDP server is running..."); while(true){ listenning(); } } private void getDBConnection(String dbName, String username, String password) { String dbUrl = "jdbc:mysql://localhost:3306/" + dbName; String dbClass = "com.mysql.jdbc.Driver"; try { Class.forName(dbClass); con = DriverManager.getConnection (dbUrl, username, password); } catch(Exception e) { view.showMessage(e.getStackTrace().toString()); } } 215 private void openServer(int portNumber){ try { myServer = new DatagramSocket(portNumber); }catch(IOException e) { view.showMessage(e.toString()); } } private void listenning(){ User user = receiveData(); String result = "false"; if(checkUser(user)) { result = "ok"; } sendData(result); } private void sendData(String result){ try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(result); oos.flush(); InetAddress IPAddress = receivePacket.getAddress(); int clientPort = receivePacket.getPort(); byte[] sendData = baos.toByteArray(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, clientPort); myServer.send(sendPacket); } catch (Exception ex) { view.showMessage(ex.getStackT race().toString()); } } private User receiveData(){ User user = null; 216 try { byte[] receiveData = new byte[1024]; receivePacket = new DatagramPacket(receiveData, receiveData.length); myServer.receive(receivePacket); ByteArrayInputStream bais = new ByteArrayInputStream(receiveData); ObjectInputStream ois = new ObjectInputStream(bais); user = (User)ois.readObjjctQ; } catch (Exception ex) { view.showMessage(ex.getStackT race().toString()); } return user; } private boolean checkUser(User user) { String query = "Select * FROM users WHERE username ='" + user.getUserName()+ "' AND password ='" + user.getPassword() + "'"; try { Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); if (rs.next()) { return true; } }catch(Exception e) { view.showMessage(e.getStackTrace().toString()); } return false; } } ServerRun.java package udp.server; public class ServerRun { public static void main(String[] args) { 217 ServerView view = new ServerView(); ServerControl control = new ServerControl(view); } Kết quả Login thành công: Login lỗi: 7.5. Lấy dữ liệu web 7.5.1. URL và URI 7.5.2. Sử dụng URLConnection để truy xuất dữ liệu 7.6. Gửi Email Gửi mail trong java sử dụng JavaMail. Đây là một nền tảng và giao thức độc lập được sử dụng để gửi, nhận và đọc mail thông qua ứng dụng Java. Sử dụng JavaMail API này để tạo ra những ứng dụng Java có tính năng hỗ trợ gửi email cho người dùng. Ví dụ sau khi đăng ký thành công một tài khoản, ứng dụng sẽ gửi email thông báo đên người dùng, Hình bên dưới là một minh hoạ về sử dụng JavaMail. 218 Hình 7.6. Minh hoạ sử dụng JavaMail 7.6.1.1. Mô tả các giao thức mail khác nhau Hiện nay có 3 giao thức cơ bản được ứng dụng trong mail server giúp hệ thống có thể hoạt động trơn tru và đảm bảo khả năng bảo mật cao nhất, bao gồm: - SMTP – Simple Mail Transfer Porotocol: SMTP được sử dụng khi gửi từ một ứng dụng email như Postfix với một máy chủ email hoặc khi email được gửi từ một máy chủ email khác. Giao thức này sử dụng cổng TCP 25. - POP3 – Post Office Porotocol version 3: giao thức này được dùng để tải một email từ một máy chủ email. POP3 sử dụng cổng TCP 110. - IMAP – Internet Message Access Protocol: Đây là giao thức thế hệ mới của POP. IMAP sử dụng cổng TCP 143 và đặt sự kiểm soát email trên mail server. IMAP có thể hoạt động ở 3 chế độ: trực tuyến, ngoại tuyến và ngắt kết nối. Chế độ ngoại tuyến được thực hiện như sau: khi các email đã được chuyển tới máy client, nó sẽ bị xóa khỏa mail server và sau đó hệ thống bị ngắt. Lúc này người dùng có thể đọc, trả lời và làm một số việc khác ở chế độ ngoại tuyến. Tuy nhiên nếu họ muốn gửi thư, họ phải kết nối lại. Như vậy ở trong chế độ này, thông điệp được lưu tạm ở client server giúp người dùng có thể sử dụng bình thường và ở lần kết nối kế tiếp nó sẽ được cập nhập trở lại vào mail server. Hình 7.7. Các giao thức mail 219 7.6.2. Khái niệm Session Lớp Session mô tả một mail session và không có các lớp phụ, Nó thu thập các thuộc tính và giá trị mặc định được sử dụng bới mail API. Một phiên mặc định có thể được chia sẻ bởi nhiều ứng dụng trên desktop. Các session không chia sẻ cũng có thể được tạo ra. Lớp Session cung cấp quyền truy cập tới các nhà cũng cấp thực hiện Store, Transport và các lớp liên quan.Các giao thức cung cấp cấp hình bằng cách sử dụng các tệp: javamail.providers and javamail.default.providers javamail.address.map and javamail.default.address.map 7.6.3. Cách tạo message Tạo một đối tượng MimeMessage với một số thiết lập cơ bản như: Người gửi (from), người nhận (to), chủ đề (subject) và nội dung (body) Message msg = new MimeMessage(s); msg.setFrom(new InternetAddress(from)); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); msg.setSubject(subject); msg.setText(body); 7.6.4. Các bước để tạo và gửi message Bước 1. Tạo đối tượng Properties và chỉ định thông tin host, post Properties p = new Properties(); p.put("mail.smtp.auth", "true"); p.put("mail.smtp.starttls.enable", "true"); p.put("mail.smtp.host", "smtp.gmail.com"); p.put("mail.smtp.port", 587); Bước 2. Tạo đối tượng session Session s = Session.getInstance(p, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(accountName, accountPassword); } }); Trong đó accountName và accountPassword là tài khoản gmail. Bước 3. Tạo đối tượng message 220 Message msg = new MimeMessage(s); msg.setFrom(new InternetAddress(from)); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); msg.setSubject(subject); msg.setText(body); Bước 4. Gửi mail Transport.send(msg); 7.6.5. Các bước cần thiết để đọc một message Bước 1. Tạo đối tượng Properties và chỉ định thông tin host, post Properties p = new Properties(); p.put("mail.smtp.auth", "true"); p.put("mail.smtp.starttls.enable", "true"); p.put("mail.smtp.host", "smtp.gmail.com"); p.put("mail.smtp.port", 587); Bước 2. Tạo Authentication javax.mail.Authenticator pa = null; //default: no authentication if (username != null && password != null) { props.put(“mail.smtp.auth”, “true”); pa = new javax.mail.Authenticator (){ public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }; }//else: no authentication Bước 3.Kết nối tới POP3 server Session session = Session.getDefaultInstance(props, pa); Store store = session.getStore(provider); store.connect(host, username, password); Bước 4. Đọc mail Folder inbox = store.getFolder(“INBOX”); // 221 inbox.open(Folder.READ_ONLY); // Message[] messages = inbox.getMessages(); 7.6.6. Các bước cần thiết để trả lời một email Bước 1. Đọc email như các bước ở trên Bước 2. Chọn email để trả lời Message[] messages = folder.getMessages(); for (int i = 0, n = messages.length; i < n; i++) { Message message = messages[i]; } Bước 3. Tạo đối tượng message Message replyMessage = new MimeMessage(session); replyMessage = (MimeMessage) message.reply(false); replyMessage.setFrom(new InternetAddress(to)); replyMessage.setText("Thanks"); replyMessage.setReplyTo(message.getReplyTo()); Bước 4. Gửi mail Transport t = session.getTransport("smtp"); t.sendMessage(replyMessage, replyMessage.getAllRecipients()); 222 CÂU HỎI ÔN TẬP, THẢO LUẬN Câu 1. Mỗi đối tượng trong lớp InetAddress chứa mấy thành phần chính? Lớp kế thừa từ lớp InetAddress gồm những lớp nào? Câu 2. Phương thức sau trả về kết quả gì: InetAddress[] addresses = InetAddress.getAllByName(String name) throws UnknownHostException Câu 3. Chương trình sau cho kết quả gì? import java.net.*; public class MyAddress { public static void main(String[] args) { try { InetAddress me = InetAddress.getLocalHost( ); String dottedQuad = me.getHostAddress( ); System.out.println("My address is " + dottedQuad); catch (UnknownHostException ex) { System.out.println("I'm sorry. I don't know my own address."); } } } Câu 4. Chương trình sau cho kết quả gì? import java.net.*; public class AddressTests { public static int getVersion(InetAddress ia) { byte[] address = ia.getAddress( ); if (address.length == 4) return 4; else if (address.length == 6) return 6; else return -1; } Câu 5. Liệt kê tóm tắt một số lớp Java hỗ trợ lập trình với TCPSocket. Giái thích tác dụng của các lớp. Câu 6. Trình bày kỹ thuật lập trình truyền thông với giao thức TCP? Câu 7. Tóm tắt Một số lớp Java hỗ trợ lập trình với UDPSocket. Giải thích tác dụng của các lớp đó. 223 Câu 8. Trình bày kỹ thuật lập trình truyền thông với giao thức UDP. So sánh với giao thức TCP? BÀI TẬP ỨNG DỤNG Bài 1. Viết chương trình nhận đối số là một URL. Nối kết đến Web Server trong URL nhận được, lấy trang web về và in ra màn hình theo dạng textfile (html). Bài 2. Viết chương trình gửi đến URL một chuỗi, mở kết nối từ URL này và hiển thông tin header. Chức năng chương trình: - Mở kết nối đến địa chỉ URL - Hiển thị thông tin các header nhận được Bài 3. Viết chương trình in ra địa chỉ của localhost (địa chỉ cục bộ), null host và địa chỉ bất kì trên internet. Bài 4. Viết chương trình đọc file từ xa thông qua web server. Bài 5. Viết chương trình download file thông qua web server. Bài 6.Viết chương trình cộng hai số nguyên - Client: Nhập vào từ bàn phím 2 số nguyên (a,b). Client chờ nhận kết quả từ Server để in ra màn hình. - Server: Nhận 2 số nguyên mà Client vừa gửi, tính tổng, tích, thương của chúng và gửi kết quả cho Client. Bài 7. Viết chương trình kiểm tra số -Client: Nhập vào một số.Client chờ nhận kết quả từ Server để in ra màn hình. -Server:Nhận số mà Client vừa gửi, Server tiến hành kiểm tra số đó có là nguyên tố, số hoàn hảo hay không và gửi lại cho Client. Bài 8. Viết chương trình -Client: Nhập vào một mảng số nguyên . Client chờ nhận kết quả từ Server để in ra màn hình. -Server: Nhận mảng mà Client vừa gửi, Server tiến hành tìm các số chẵn và gửi lại cho Client. Bài 9. Xây dựng một mô hình ứng dụng khách/chủ (client/server) sử dụng lớp Socket và ServerSocket để kết nối và trao đổi thông tin giữ máy khách và máy chủ. Máy khách (client) sẽ gửi một chuỗi đến máy chủ (server), máy chủ sẽ chuẩn hóa và đảo ngược thứ tự của chuỗi và gửi trả về cho máy khách. Bài 10. Tạo ra hai ứng dụng độc lập (một client và một server). Client chấp nhận một trong các số sau: 1, 2, 3. Số này sẽ được gửi đến server. Server sẽ trả lại tương ứng : “ONE” hoặc “TWO” hoặc “THREE” (tùy theo số nhận được). Dùng giao thức TCP/IP 224 Chức năng chương trình: - Client gửi số bất kì đến SERVER - Nếu là số 1,2,3 thì trả về ONE,TWO,THREE, các trường hợp còn lại trả về UNKNOWN. Bài 11. Viết chương trình Talk theo chế độ không nối kết. Cho phép hai người ngồi trên hai máy tính có thể tán gẫu (chat) với nhau. Bài 12. Xây dựng chương trình ExchangeRateServer ExchangeRateServer chạy trên máy chủ và đón nhận những dữ liệu do máy khách gửi đến cổng 2345. Khi nhận được yêu cầu máy chủ sẽ gửi trả các thông báo về tỉ giá kèm theo ngày giờ mới nhất về cho máy khách. Ta sử dụng hàm random của lớp Math để lấy về tỷ giá mang tính chất ngẫu nhiên của 3 thị trường là Tokyo, NewYork và HongKong. Dữ liệu được nhận và gửi theo từng gói dựa vào lớp DatagramPackage Chương trình chạy trên máy chủ cung cấp tỷ giá của các thị trường chứng khoán. Bài 13. Xây dựng chương trình multicast theo mẫu bên dưới . Chức năng chương trình: - Tham gia vào group của multicast - Gửi dữ liệu đến địa chỉ multicast - Nhận dữ liệu từ multicast - Hiển thị lên màn hình - Chỉ cần các client tham gia vào group của địa chỉ multicast này thì khi có dữ liệu được gửi vào đó thì tất cả client đều nhận được Cơ chế: - Tham gia vào group của địa chỉ multicast - Gửi dữ liệu đến địa chỉ multicast (Lúc này các client muốn nhận được thì phải tham gia vào group của multicast đó thì mới nhận được) - Vì trong chương trình cũng tham gia vào group multicast nên nó cũng sẽ nhận được dữ liệu khi có client gửi vào địa chỉ này Bài 14. Viết Chương trình multicast video bằng Java. Bài 15. Viết chương trình gửi nhận mail bằng java Bài 16. Viết chương trình chat đa người dùng bằng Java 225 TÀI LIỆU THAM KHẢO [1] Cay S. Horstmann – Gary Cornell. Core Java Volum 1 - Fundamentals, Eighth Edition. The Sun Microsystems press. 2008 [2] Cay S. Horstmann – Gary Cornell. Core Java Volum 2 – Advanced Features, Eighth Edition. The Sun Microsystems press. 2008 [3] Joyce Farrell. Java Programming Introductory. Course Technology © 1999 [4] Bruce Eckel. Thinking in Java, Fourth Edition. Prentice Hall – 2006 [5] Herbert Schildt. Java 2. A Beginner’s Guide. Second Edition. McGraw-Hill - 2003. [6] Dr. Harvey M. Deitel - Paul J. Deitel. Java How to Program, 4th (Deitel). Prentice Hall - 2002 [7] Simon Roberts – Philip Heller – Michael Ernest. Complete Java 2 Certification – study guide. BPB Publications – 2000. [8] [9] [10] Đoàn Văn Ban, Lập trình hướng đối tượng với JAVA, nhà xuất bản Khoa học và Kỹ thuật 2005. 226
File đính kèm:
- giao_trinh_cong_nghe_java.pdf