Lập trình mạng Java

MỤC LỤC

Lời mở đầu

Chương 1:Các khái niệm căn bản về mạng và giao thức . 1

1. Mạng máy tính . 1

1.1. Các đường WAN . 1

1.2 .Giao thức Ethernet . 2

1.3. Các thành phần vật lý . 3

2. Mô hình phân tầng . 6

2.1. Tầng 1:Tầng vật lý. 7

2.2. Tầng 2: Tầng liên kết dữ liệu . 7

2.3. Tầng 3: Tầng mạng . 7

2.4. Tầng 4:Tầng giao vận . 7

2.5. Tầng 5: Tầng phiên .

2.6. Tầng 6:Tầng trình diễn . 7

2.7. Tầng 7:Tầng ứng dụng . 7

3. Các giao thức mạng . 8

3.1. Các giao thức cơ bản . 8

3.2. Các giao thức Internet . 14

4. Soket . 17

5. Dịch vụ tên miền . 17

5.1. Các server tên miền . 18

5.2. Nslookup . 19

6. Internet và Extranet . 20

6.1. Intranet và Extranet20

6.2. Firewall . 20

6.3. Proxy Server . 20

Chương 2 : Giới thiệu ngôn ngữ lập trình Java . 21

1. Giới thiệu công nghệ Java . 21

1.1. Lịch sử phát triển. 21

1.2. Cấu trúc của máy ảo Java – Java Virtual Machine . 21

1.3. Các đặc trưng của Java . 21

1.4. Các ấn bản Java . 22

1.5. Công cụ phát triển . 23

1.6. Các kiểu ứng dụng trong Java. 23

1.7. Cài đặt chương trình dịch Java và các công cụ . 23

1.8. Một số ví dụ mở đầu . 25

2. Ngôn ngữ lập trình Java . 27

2.1. Cấu trúc tệp của một chương trình Java . 27

2.2. Định danh, kiểu dữ liệu và khai báo biến . 28

2.3. Các kiểu dữ liệu nguyên thủy (primitive datatype) . 28

2.4. Khai báo các biến . 30

2.5. Các lệnh trong Java . 31

2.6 Các lớp và các đối tượng trong Java . 36

2.7. Giao tiếp – Interface . 48

2.8. Các gói và sử dụng gói trong Java . 50

2.9. Quản lý ngoại lệ . 52

Chương 3: Các luồng vào ra . 59

1. Khái niệm về luồng trong Java . 59

1.1. Khái niệm luồng(stream) . 59

2. Luồng xuất nhập chuẩn . 60

3. Luồng nhị phân . 60

3.1. Lớp InputStream . 60

3.2. Lớp OutputStream . 61

3.3. Các luồng xuất nhập mảng byte . 62

3.4. Luồng xuất nhập tập tin . 64

3.5. Truy nhập tệp ngẫu nhiên . 66

3.6. Luồng PrintStream . 68

4. Luồng ký tự . 68

4.1. Sự tương ứng giữa luồng byte và luồng ký tự . 68

4.2. Mã hóa ký tự . 69

4.3 Lớp Writer . 70

4.4. Lớp Reader . 70

4.5. Lớp OutputStreamWriter . 70

4.6. Lớp InputStreamReader . 71

4.7. Lớp FileWriter . 71

4.8. Lớp FileReader . 72

5. Luồng đệm . 73

6. Luồng vào ra mới – New Input Output . 74

6.1. Căn bản về NIO . 74

6.2. Buffer (Các vùng đệm) . 74

6.3. Các kênh (Channel) . 76

6.4. Charset và Selector . 76

6.5. Đọc tệp . 77

6.6. Ghi tệp tin . 80

7. Kết luận . 82

Chương 4: Lập trình đa tuyến đoạn . 83

1.Tổng quan83

1.1. Lập trình đơn tuyến đoạn . 83

1.2. Lập trình đa tiến trình . 83

1.3. Lập trình đa tuyến đoạn. 84

2. Tạo các ứng dụng đa tuyến đoạn với lớp Thread . 86

3. Tạo ứng dụng đa tuyến đoạn với giao tiếp Runnable . 87

4. Sự đồng bộ hóa . 88

4.1. Các phương thức synchronized . 88

4.2.Lệnh synchronized . 89

5. Phương thức wait và notify . 90

6. Lập lịch cho tuyến đoạn . 91

7. Hoài vọng-Deadlock . 92

8. Điều khiển tuyến đoạn . 94

8.1. Ngắt một tuyến đoạn Thread . 94

8.2 Kết thúc việc thực thi một tuyến đoạn. 95

8.3. Tạm dừng và phục hồi việc xử lý các tuyến đoạn . 96

9. Các nhóm tuyến đoạn –ThreadGroup . 96

9.1. Tạo một nhóm Thread . 98

10. Một ví dụ minh họa việc sử dụng tuyến đoạn . 98

11. Kết luận . 100

Chương 5: Lập trình mạng với các lớp InetAddress, URL và URLConnection . 102

1. Lớp InetAddress102

1.1. Tạo các đối tượng InetAddress102

1.2. Nhận các trường thông tin của một đối tượng InetAddress . 103

1.3. Một số chương trình minh họa . 104

2. Lớp URL . 105

2.1. Tạo các URL . 105

2.2. Phân tích một URL thành các thành phần . 106

2.3. Tìm kiếm dữ liệu từ một URL . 108

2.4. Các phương thức tiện ích . 109

3. Lớp URLConnection109

3.1. Mở các URLConnection . 110

3.2. Đọc dữ liệu từ một server . 111

3.3. Phân tích Header . 113

Chương 6: Lập trình Socket cho giao thức TCP . 119

1. Mô hình client/server . 119

2. Các kiến trúc Client/Server . 120

2.1. Client/Server hai tầng (two-tier client/server) . 120

2.2. Client/Server ba tầng . 121

2.3. Kiến trúc n-tầng . 122

3. Mô hình truyền tin socket . 122

4. Socket cho Client. 124

4.1. Các constructor . 124

4.2. Nhận các thông tin về Socket . 125

4.3. Đóng Socket. 126

4.4. Thiết lập các tùy chọn cho Socket127

4.5. Các phương thức của lớp Object127

4.6. Các ngoại lệ Socket . 127

4.7. Các lớp SocketAddress . 127

5. Lớp ServerSocket . 128

5.1. Các constructor . 128

5.2. Chấp nhận và ngắt liên kết . 129

6. Các bước cài đặt chương trình phía Client bằng Java . 131

7. Các bước để cài đặt chương trình Server bằng Java . 134

8. Ứng dụng đa tuyến đoạn trong lập trình Java . 136

9. Kết luận . 141

Chương 7: Lập trình ứng dụng cho giao thức UDP . 142

1. Tổng quan về giao thức UDP . 142

1.1 Một số thuật ngữ UDP . 142

1.2. Hoạt động của giao thức UDP . 143

1.3. Các nhược điểm của giao thức UDP . 143

1.4. Các ưu điểm của UDP . 144

1.5. Khi nào thì nên sử dụng UDP . 144

2. Lớp DatagramPacket. 145

2.1. Các constructor để nhận datagram . 145

2.2. Constructor để gửi các datagram . 146

3. Lớp DatagramSocket. 148

4. Nhận các gói tin . 148

5. Gửi các gói tin . 150

6. Ví dụ minh họa giao thức UDP . 151

Chương 8: Phân tán đối tượng trong Java bằng RMI . 159

1.Tổng quan . 159

2. Mục đích của RMI . 159

3. Một số thuật ngữ . 160

4. Các lớp trung gian Stub và Skeleton . 160

5. Cơ chế hoạt động của RMI . 160

6. Kiến trúc RMI . 163

7. Cài đặt chương trình. 164

8. Triển khai ứng dụng . 166

9. Các lớp và các giao tiếp trong gói java.rmi . 167

9.1. Giao tiếp Remote . 167

9.2. Lớp Naming . 167

10. Các lớp và các giao tiếp trong gói java.rmi.registry . 168

10.1. Giao tiếp Registry . 168

10.2. Lớp LocateRegistry . 168

11. Các lớp và các giao tiếp trong gói java.rmi.server . 169

11.1. Lớp RemoteObject . 169

11.2. Lớp RemoteServer . 169

11.3. Lớp UnicastRemoteObject . 169

12. Kết luận169

Chương 9 : Xử lý cơ sở dữ liệu trong Java . 171

1. JDBC Java Database Connectivity API . 171

2. Cấu trúc của JDBC . 171

2.1. Kiểu 1 . 172

2.2. Kiểu 2 . 173

2.3. Kiểu 3 . 174

2.4. Kiểu 4 . 175

3. Kết nối cơ sở dữ liệu . 176

3.1. DriverManager . 176

3.2. Connection . 176

3.3. Statement . 177

3.4. ResultSet . 177

4. Lớp DatabaseMetaData . 178

5. Lớp ResultSetMetaData . 179

6. Các bước cơ bản để kết nối với cơ sở dữ liệu từ một ứng dụng Java . 180

7. Sử dụng PreparedStatement . 185

8. Sử dụng các giao tác . 187

Tài liệu tham khảo . 190

pdf214 trang | Chuyên mục: Java | Chia sẻ: dkS00TYs | Lượt xem: 3199 | Lượt tải: 1download
Tóm tắt nội dung Lập trình mạng Java, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 viết một server thực hiện phép nhân 
hai mảng số nguyên với nhau. Client gửi hai đối tượng, mỗi đối tượng biểu 
diễn một mảng nguyên; server nhận các đối tượng này, thực hiện lời gọi 
phương nhân hai mảng số nguyên với nhau và gửi kết quả trả về cho client. 
Trước tiên chúng ta định nghĩa đối tượng để có thể sử dụng trong 
việc truyền các đối tượng. 
public class ArrayObject implements java.io.Serializable{ 
 private int[] a=null; 
 public ArrayObject(){ 
 } 
 public void setArray(int a[]){ 
 this.a=a; 
 } 
 public int[] getArray(){ 
 return a; 
 } 
} 
Lớp ArrayObject là lớp được xây dựng để đóng gói các mảng số 
nguyên và có khả năng truyền đi qua lại trên mạng. Cấu trúc lớp như sau: 
trường thông tin là một mảng số nguyên a[]; phương thức setArray() thiết 
lập giá trị cho mảng. Phương thức getArray() trả về một mảng số nguyên từ 
đối tượng ArrayObject. 
Sưu tầm bởi: www.daihoc.com.vn 
Mô hình client/server tối thiểu phải có hai mođun client và server. 
Trong ví dụ này cũng vậy ta sẽ xây dựng một số mođun chương trình như 
sau: 
Đầu tiên chúng ta phát triển client. Client tạo ra hai thể hiện của các 
đối tượng ArrayObject và ghi chúng ra luồng xuất (thực chất là gửi tới 
server). 
public class ArrayClient{ 
 public static void main(String[] args)throws Exception{ 
 ObjectOuputStream oos=null; 
 ObjectInputStream ois=null; 
 int dat1[]={3,3,3,3,3,3,3}; 
 int dat2[]={5,5,5,5,5,5,5}; 
 Socket s=new Socket("localhost",1234); 
 oos=new ObjectOuputStream(s.getObjectOuput()); 
 ois=new ObjectInputStream(s.getInputStream()); 
 ArrayObject a1=new ArrayObject(); 
 a1.setArray(dat1); 
 ArrayObject a2=new ArrayObject(); 
 a2.setArray(dat2); 
 ArrayObject res=null; 
 int r[]=new int[7]; 
 oos.writeObject(a1); 
 oos.writeObject(a2); 
 oos.flush(); 
 res=(ArrayObject)ois.readObject(); 
 r=res.getArray(); 
 System.out.println("The result received from server..."); 
 System.out.println(); 
 for(int i=0;i<r.length;i++)System.out.print(r[i]+" "); 
 } 
} 
Bước tiếp theo chúng ta phát triển server. Server là một chương trình 
cung cấp dịch vụ phục vụ các yêu cầu của client. Server nhận hai đối tượng 
ArrayObject và nhận về hai mảng từ hai đối tượng này và sau đó đem nhân 
chúng với nhau và gửi kết quả trở lại cho client. 
Sưu tầm bởi: www.daihoc.com.vn 
public class ArrayServer extends Thread { 
 private ServerSocket ss; 
 public static void main(String args[])throws Exception 
 { 
 new ArrayServer(); 
 } 
 public ArrayServer()throws Exception{ 
 ss=new ServerSocket(1234); 
 System.out.println("Server running on port "+1234); 
 this.start(); 
 } 
 public void run(){ 
 while(true){ 
 try{ 
 System.out.println("Waiting for client..."); 
 Socket s=ss.accept(); 
 System.out.println("Accepting a connection 
from:"+s.getInetAddress()); 
 Connect c=new Connect(s); 
 } 
 catch(Exception e){ 
 System.out.println(e); 
 } 
 } 
 } 
} 
Trong mô hình client/server tại một thời điểm server có thể phục vụ 
các yêu cầu đến từ nhiều client, điều này có thể dẫn đến các vấn đề tương 
tranh. Chính vì lý do này mà lớp ArrayServer thừa kế lớp Thread để giải 
quyết vấn đề trên. Ngoài ra để nâng cao hiệu suất của chương trình thì sau 
khi đã chấp nhận liên kết từ một client nào đó, việc xử lý dữ liệu sẽ được 
dành riêng cho một tuyến đoạn để server có thể tiếp tục chấp nhận các yêu 
cầu khác. Hay nói cách khác, mỗi một yêu cầu của client được xử lý trong 
một tuyến đoạn riêng biệt. 
class Connect extends Thread{ 
 private Socket client=null; 
 private ObjectInputStream ois; 
Sưu tầm bởi: www.daihoc.com.vn 
 private ObjectOuputStream oos; 
 public Connect(){ 
 } 
 public Connect(Socket client){ 
 this.client=client; 
 try{ 
 ois=new ObjectInputStream(client.getInputStream()); 
 oos=new ObjectOuputStream(client.getObjectOuput()); 
 } 
 catch(Exception e){ 
 System.err.println(e); 
 } 
 this.start(); 
 } 
 public void run(){ 
 ArrayObject x=null; 
 ArrayObject y=null; 
 int a1[]=new int[7]; 
 int a2[]=new int[7]; 
 int r[]=new int[7]; 
 try{ 
 x=(ArrayObject)ois.readObject(); 
 y=(ArrayObject)ois.readObject(); 
 a1=x.getArray(); 
 a2=y.getArray(); 
 for(int i=0;i<a1.length;i++)r[i]=a1[i]*a2[i]; 
 ArrayObject res=new ArrayObject(); 
 res.setArray(r); 
 oos.writeObject(res); 
 oos.flush(); 
 ois.close(); 
 client.close(); 
 } 
 catch(Exception e){ 
 } 
Sưu tầm bởi: www.daihoc.com.vn 
 } 
 } 
3. Truyền các đối tượng thông qua giao thức UDP 
Một giao thức gần với giao thức TCP là giao thức UDP. Java hỗ trợ 
cho kiểu ứng dụng truyền tin phi liên kết trên giao thức UDP thông qua lớp 
DatagramSocket và DatagramPacket. Liệu chúng ta có thể viết được các 
chương trình nhập và xuất đối tượng bằng truyền tin datagram? Thực hiện 
điều này không thể tiến hành trực tiếp như với luồng Socket. Vấn đề là 
DatagramSocket không được gắn với bất kỳ luồng nào; mà nó sử dụng một 
tham số mảng byte để gửi và nhận dữ liệu. 
Hình 6 
Có thể thấy rằng để xây dựng một gói tin datagram, đối tượng phải 
được chuyển thành một mảng byte. Việc chuyển đổi này rất khó để thực 
hiện nếu bản thân đối tượng có liên quan đến một số đối tượng phức tạp 
trong đồ thị đối tượng. 
Hình 6 minh họa dòng luân chuyển dữ liệu khi truyền một đối tượng 
thông qua một datagram. Dưới đây là bảy bước ta cần thực hiện để cài đặt 
mô hình truyền dữ liệu cho giao thức UDP 
 Bước 1. Chuẩn bị: Tạo đối tượng cần truyền đi, giả sử đối tượng này 
là obj, làm cho nó khả tuần tự bằng cách thực thi giao tiếp 
Serializable. 
 Bước 2. Tạo một luồng ByteArrayObjectOuput và đặt tên cho nó là 
baos. 
 Bước 3. Xây dựng đối tượng ObjectOuputStream và đặt tên cho nó là 
oos. Tham số cho cấu tử ObjectOuputStream là baos 
 Bước 4. Ghi đối tượng obj vào luồng baos bằng cách sử dụng 
phương thức writeObject() của oos. 
 Bước 5. Tìm kiếm vùng đệm dữ liệu mảng byte từ bằng cách sử dụng 
phương thức toByteAray(). 
Object 
ObjectOuputStream 
ByteArrayObjectOuput 
DatagramPacket 
Object 
ObjectInputStream 
ByteArrayInputStream 
DatagramPacket 
Network 
Sưu tầm bởi: www.daihoc.com.vn 
 Bước 6. Xây dựng đối tượng DatagramPacket và đặt tên là dp với dữ 
liệu đầu vào là vùng đệm dữ liệu đã tìm được ở bước 5. 
 Bước 7. Gửi dp thông qua DatagramSocket bằng cách gọi phương 
thức send() của nó. 
Ví dụ minh họa chi tiết quá trình gửi một đối tượng 
InetAddress ia=InetAddress.getByName("localhost"); 
Student st=new Student("Peter",7,8,9); 
DatagramSocket ds=new DatagramSocket(); 
ByteArrayObjectOuput baos=new ByteArrayObjectOuput(5000); 
ObjectOuputStream oos=new ObjectOuputStream(new 
BufferedObjectOuput(baos)); 
oos.flush(); 
oos.writeObject(st); 
oos.flush(); 
byte[] b=baos.toByteAray(); 
DatagramPacket dp=new DatagramPacket(b,b.length,ia,1234); 
ds.send(dp); 
oos.close(); 
Để nhận một đối tượng ta cũng tiến hành các bước như trên nhưng theo 
thứ tự ngược lại, thay thế luồng ObjectOuputStream bằng 
ObjectInputStream và ByteArrayObjectOuput bằng ByteArrayInputStream. 
Ví dụ dưới đây minh họa chi tiết quá trình nhận một đối tượng 
DatagramSocket ds=new DatagramSocket(1234); 
 while(true){ 
 byte b[]=new byte[5000]; 
 DatagramPacket dp=new DatagramPacket(b,b.length); 
 ds.receive(dp); 
ByteArrayInputStream bais=new 
 ByteArrayInputStream(new BufferedInputStream(b)); 
 ObjectInputStream ois =new ObjectInputStream(bais); 
 Student st=(Student)ois.readObject(); 
 st.computeAverage(); 
 st.print(); 
 ois.close(); 
 bais.close(); 
 } 
Sưu tầm bởi: www.daihoc.com.vn 
4. Kết luận 
Qua bài báo này tôi đã giới thiệu tổng quan về tuần tự hóa đối tượng. 
Thông qua các ví dụ chúng ta thấy không quá khó để làm việc với tuần tự 
hóa đối tượng và điều quan trọng hơn là chúng ta đã biết cách để truyền đi 
các đối tượng có cấu trúc phức tạp thông qua các Socket. 
 Ngoài ra, bài báo cũng đã đề cập tới cách truyền đối tượng bằng 
cách sử dụng các gói tin datagram. Nhờ những ưu điểm của tiện ích tuần tự 
hóa đối tượng, tôi đã minh họa một cách truyền các đối tượng bằng cách 
sử dụng các gói tin datagram. Như chúng ta đã thấy, mặc dù trong giao 
thức này không hỗ trợ xử lý theo luồng dữ liệu nhưng tôi đã “luồng hóa” các 
đối tượng để đưa các đối tượng vào các mảng byte. 
Sự lựa chọn giữa việc sử dụng RMI hay giải pháp Socket kết hợp với 
tuần tự hóa phụ thuộc vào từng dự án và các yêu cầu của nó. Sự lựa chọn 
giải pháp nào chính là sự thỏa hiệp giữa các đặc trưng của mỗi giải pháp: 
nếu đối với RMI thì đó là tính đơn giản khi triển khai, ngược lại với Socket 
kết hợp với tuần tự hóa đối tượng thì đó lại là ưu thế về mặt hiệu năng. Nếu 
vấn đề hiệu năng có tầm quan trọng thì giải pháp lập trình Socket kết hợp 
tuần tự hóa đối tượng là giải pháp tốt hơn so với RMI. 
Sưu tầm bởi: www.daihoc.com.vn 
 90
TÀI LIỆU THAM KHẢO 
[1] Elliotte Rusty Harold, Java Network Programming 
[2] Nguyễn Phương Lan- Hoàng Đức Hải, Java lâp trình mạng, Nhà xuất bản Giáo 
dục 
[3] Darrel Ince & Adam Freemat, Programming the Internet with Java, Addison-
Wesley 
[4] Mary Campione&Kathy Walrath&Alison Huml, Java™ Tutorial, Third Edition: A 
Short Course on the Basics, Addison Wesley 
[5] The Complete Java 2Reference 
[6] Nguyễn Thúc Hải, Mạng máy tính và các hệ thống mở, Nhà xuất bản Giáo dục 
[7] Đ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 
Tài liệu tham khảo 
[1] Douglas E.Comer, David L.Stevens, Client-Server Programming And 
Applications. In book: Internetworking with TCP/IPVolume III, Pearson 
Education, Singapore, 2004. 
[2] Herbert Schildt, JavaTM 2: The Complete Reference Fifth Edition, Tata 
McGraw-Hill Publishing Company Limited, India, 2002. 
[3] Elliote Rusty Harold, JavaTM Network Programming, Third Edition, 
Oreilly, 2005. 
[4] Qusay H. Mahmoud, Advanced Socket Programming, 
 December 2001 
[5] Shengxi Zhou, Transport Java objects over the network with datagram 
packets,  2006 

File đính kèm:

  • pdfLập trình mạng Java.pdf
Tài liệu liên quan