Lập trình mạng - Chương 5: Lập trình mạng với Java

Giới thiệu gói thư viện Java.net

Sử dụng TCP socket

Sử dụng UDP socket

RMI và kỹ thuật phân tán đối tượng

pdf32 trang | Chuyên mục: Java | Chia sẻ: dkS00TYs | Lượt xem: 3417 | Lượt tải: 2download
Tóm tắt nội dung Lập trình mạng - Chương 5: Lập trình mạng với Java, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
,int port): tạo đối 
tượng socket kết nối đến address và port.
• Socket(String hostName, int port, boolean 
stream): tạo đối tượng socket kết nối đến hostName và 
port, stream=true nếu qui định kết nối theo TCP, stream=false 
nếu qui định kết nối theo UDP. Tuy nhiên nếu sử dụng socket 
theo UDP thì nên sử dụng lớp DatagramSocket.
Lớp Socket(tt)
 Các phương thức thường được sử dụng:
• InputStream getInputStream() : lấy luồng 
nhập để có thể nhận dữ liệu từ máy ở xa.
• OutputStream getOutputStream(): lấy luồng 
xuất để có thể gửi dữ liệu đến máy ở xa.
7
• InetAddress getInetAddress(): trả về đối 
tượng InetAddress chứa địa chỉ của máy đang kết nối 
đến.
• int getPort(): trả về số hiệu cổng sử dụng của 
máy đang kết nối.
• void close(): đóng socket, cắt kết nối.
Lớp Socket(tt)-Ví dụ
try{
//Kết nối đến máy chủ
Socket mySocket=new Socket(“www.hcmutrans.edu.vn”,8080);
//Luồng nhâp để nhận dữ liệu
DataInputStream inStream=new DataInputStream(mySocket.getInputStream());
//Luồng xuất để gửi dữ liệu
DataOutputStream outStream=new DataOutputStream(mySocket.getOutputStream());
8
//Bắt đầu gửi nhận dữ liệu qua inStream và outStream …
}
catch(Exception e){
System.out.println(e);
}
Lớp ServerSocket
 Sử dụng cho server, tạo socket và lắng 
nghe kết nối trên một port
 Hàm tạo và các phương thức:
• ServerSocket(int port): tạo đối tượng socket và lắng 
9
nghe ở port.
• Socket accept(): dừng lại và đợi client kết nối đến, khi 
nhận được thông tin kết nối sẽ trả về đối tượng Socket kết nối 
với client.
• void close(): cắt kết nối và đóng socket.
Lớp ServerSocket(tt)-Ví dụ
try{
//Tạo serverSocket lắng nghe ở cổng 12345
ServerSocket server=new ServerSocket(12345);
//Chờ client kết nối đến
Socket client=server.accept();
10
//Tạo InputStream và OutputStream qua socket client 
// và bắt đầu gửi nhận dữ liệu…
}
catch(Exception e){
System.out.println(e);
}
Lớp DatagramSocket
 Sử dụng giao thức UDP, truyền nhận dữ 
liệu dưới dạng gói tin.
 Hàm tạo và các phương thức:
• DatagramSocket(): tạo đối tượng socket sử dụng giao thức 
11
UDP.
• DatagramSocket(int port): tạo đối tượng socket và kết 
nối đến số hiệu cổng port.
• void send(DatagramPacket p): gửi gói tin p đi.
• void receive(DatagramPacket p): nhận gói tin p về.
• void close(): đóng socket.
Lớp DatagramPacket
 Khai báo gói tin gửi đi trên mạng qua kết nối 
DatagramSocket.
 Hàm tạo và các phương thức:
• DatagramPacket(byte buffer[], int len): tạo gói tin 
có dữ liệu chứa trong buffer, chiều dài buffer là len.
12
• DatagramPacket(byte buffer[], int len, 
InetAddress dest, int port): tạo gói tin gửi đến địa chỉ 
dest với số hiệu cổng port.
• InetAddess getAddress(): lấy địa chỉ chứa trong gói tin.
• int getPort(): lấy số hiệu cổng chứa trong gói tin.
• byte[] getData(): lấy dữ liệu trong gói tin.
• int getLength(): lấy chiều dài gói dữ liệu.
Lớp DatagramSocket & 
DatagramPacket(tt)-Ví dụ
try{
//Tạo socket UDP kết nối với cổng 2345
DatagramSocket socket=new DatagramSocket(2345);
//Khai báo Buffer gửi nhận
byte outBuffer[];
byte inBuffer[]=new byte[256];
//Khai báo Datagram Packet để gửi và nhận
DatagramPacket outDatagram;
13
DatagramPacket inDatagram=new DatagramPacket(inBuffer,inBuffer.length); 
//Bắt đầu gửi nhận dữ liệu … 
// nhận dữ liệu:
socket.receive(inDatagram); // … xử lý dữ liệu ở inBuffer
// chuẩn bị dữ liệu trong outDatagram
// gửi dữ liệu:
socket.send(outDatagram);
//……
}
catch(Exception e){
System.out.println(e);
}
Lớp URL
 URL(Uniform Resource Locator): sử 
dụng để định vị tài nguyên mạng.
 Hàm tạo và các phương thức:
• URL(String s): tạo đối tượng URL từ địa chỉ s là một chuỗi.
: lấy về nội dung từ địa chỉ URL có 
14
• Object getContent()
được.
• String getFile(): lấy về tên tập tin nằm trong chuỗi địa 
chỉ URL.
• String getHost(): lấy tên máy chủ.
• int getPort(): lấy số hiệu cổng.
• InputStream openStream(): mở luồng để đọc thông tin từ 
máy chủ.
Lớp URL-Ví dụ
try{
//Tạo URL kết nối đến trang web 
URL url=new URL(““);
//Tạo luồng nhập để đọc dữ liệu
BufferReader inStream=new BufferReader(new 
InputStreamReader(url.openStream()));
//In nội dung trang index.htm ra màn hình … 
15
String s;
while ((s=inStream.readLine())!=null){
System.out.println(s);
}
}
catch(Exception e){
System.out.println(e);
}
Sử dụng TCP socket
 Server: tạo một đối tượng ServerSocket 
lắng nghe đến một số hiệu cổng nào đó.
 Client: tạo một đối tượng Socket kết nối với 
server qua tên/địa chỉ IP và số hiệu cổng.
16
 Tham khảo hai ví dụ:
 TimeServer/TimeClient: server phục vụ truy vấn 
ngày giờ.
 CalServer/CalClient: Server phục vụ chức năng 
tính toán.
Sử dụng UDP socket
 Server: tạo một đối tượng DatagramSocket 
lắng nghe đến một số hiệu cổng nào đó.
 Client: tạo một đối tượng DatagramSocket 
và gửi dữ liệu đến server qua địa chỉ và 
17
cổng đã được biết trước. Server gửi trả dữ 
liệu qua địa chỉ và cổng của client chứa 
trong gói tin này.
 Tham khảo ví dụ:
 CurrencyServer/CurrencyClient: server phục vụ 
truy vấn giá cả ngoại tệ.
RMI và kỹ thuật lập trình phân tán 
đối tượng
 Khái niệm lập trình phân tán đối 
tượng
 Thiết kế ứng dụng phân tán RMI
 Vấn đề truyền tham số
18
 Kết nối mạng và vấn đề tường 
lửa(firewall)
 SOAP
Khái niệm lập trình phân tán đối 
tượng
 Các đối tượng nằm phân tán trên các máy 
vật lý khác nhau.
 Đối tượng có thể triệu gọi phương thức của 
đối tượng nằm trên một máy khác – triệu 
19
gọi từ xa.
 RMI (Remote method Invoke): là cách thức 
giao tiếp của các đối tượng Java có mã lệnh 
cài đặt nằm trên các máy khác nhau có thể 
triệu gọi lẫn nhau. 
Khái niệm lập trình phân tán đối 
tượng(tt)
Computer A
A1
A2
+ A1, A2 là các đối 
tượng trên máy A
+ B1 là đối tượng trên 
máy B
+ C1,C2,C3 là các đối 
tượng trên máy C
20
Computer B
B1 A2
Computer C
C1 C2
C3
Gọi phương thức từ xa và các vấn 
đề phát sinh
 Các đối tượng nằm trên các máy khác 
nhau, có không gian địa chỉ khác nhau nên 
việc tham chiếu biến hay địa chỉ là khác 
nhau.
 Ví dụ khi truyền tham số là con trỏ cho một 
phương thức gọi từ xa, ở máy này con trỏ tồn 
21
tại, nhưng ở máy ở xa, có thể chưa có vùng nhớ 
nào đã cấp phát dành cho con trỏ này.
 Lời gọi phương thức cục bộ luôn trả về kết 
quả, trong khi gọi phương thức từ xa thông 
qua kết nối mạng và có thể bị ngắt ngang 
do mạng có sự cố. 
Lớp trung gian: Stub & Skeleton
 Để giải quyết vấn đề trên, Java không 
cho phép gọi phương thức từ xa trực 
tiếp mà thông qua lớp trung gian
 Lớp trung gian tồn tại ở cả máy gọi 
22
và máy được gọi.
 Máy gọi cần lớp trung gian là Stub
 Máy được gọi cần lớp trung gian là 
Skeleton
Stub & Skeleton
Computer A
A1
A2
B1_Stub
C
1
_
S
tu
b
Computer C
A2
C
1
_
S
keleton
23
C
1
_
S
keleton
Computer B
B1
B1_Skeleton
Xây dựng ứng dụng phân tán RMI
 Ví dụ xây dựng ứng dụng CalculatorServer/Client
 Calculator: lớp có phương thức sẽ được gọi từ xa.
 CalculatorClient: lớp sử dụng các phương thức của 
Calculator
 CalculatorServer: lớp sẽ đăng ký Calculator để có thể 
gọi từ xa
24
Computer A
CalculatorClient
C
alcu
lator_
S
tu
b
Computer B
Calculator
C
alcu
lator_
S
kel
RMI
B1. Tạo interface Calculator
 Interface Calculator cần kế thừa lớp Remote để có 
thể gọi được từ xa
 File Calculator.java có nội dung như sau
import java.rmi.*;
25
public interface Calculator extends Remote{
public int sum(int n);
// sum = 1+2+3+…+n
}
//Chỉ khai báo các phương thức và 
//đối số, không có nội dung.
B2. Tạo lớp CalculatorImpl hiện 
thực interface Calculator
 File CalculatorImpl.java có nội dung:
import java.rmi.*;
public class CalculatorImpl implements Calculator{
public int sum(int n){
26
int s=0;
for (int i=1;i<n;i++)
s=s+i;
return s;
}
}
B3. Dịch thành các file class, tạo 
Stub & Skeleton
C:\>javac Calculator.java
C:\>javac CalculatorImpl.java
C:\>rmic CalculatorImpl
27
 Kết quả quá trình dịch được các file:
 Calculator.class
 CalculatorImpl.class
 CalculatorImpl_Stub.class
 CalculatorImpl_Skel.class
B4. Xây dựng CalculatorServer.java 
để cài đặt đối tượng Calculator
import java.rmi.server.*;
import java.rmi.*;
public class CalculatorServer{
public static void main(String args[]){
try{
CalculatorImpl c=new CalculatorImpl();
28
System.out.println("Exporting Calculator...");
UnicastRemoteObject.exportObject(c);
Naming.bind("rmi://localhost/MyCalculator",c);
System.out.println("Register Calculator!");
}catch(Exception e){
System.out.println(e);
}
}
}
B5. Thực thi bộ đăng ký đối tượng 
rmiregistry.exe
 Chức năng của bộ đăng ký là đón nhận các 
kết nối chứa thông tin về đối tượng do 
phương thức Naming.bind() gửi đến.
 Kích hoạt bộ đăng ký:
29
C:\jsdk\bin\rmiregistry.exe
 Kích hoạt CalculatorServer:
java CalculatorServer
B6. Xây dựng CalculatorClient.java 
sử dụng đối tượng Calculator
import java.rmi.*;
public class CalculatorClient{
public static void main(String args[]){
try{
System.out.println("Finding Object...");
Calculator c=(Calculator)Naming.lookup("rmi://localhost/MyCalculator");
//Test c
30
System.out.println("Sum(12)= " + c.sum(12));
}catch(Exception e){
System.out.println(e);
}
}
}
Triển khai ứng dụng
 Trên Server cần các file sau:
 Calculator.class
 CalculatorImpl.class
 CalculatorImpl_Skel.class
31
 CalculatorImpl_Stub.class
 CalculatorServer.class
 Trên Client cần các file sau:
 Calculator.class
 CalculatorImpl_Stub.class
 CalculatorClient.class
Truyền tham số trong các lời gọi 
phương thức từ xa
 Tham số: tham trị và tham biến
 Tham số trong RMI:
 Các kiểu dữ liệu đơn giản như: int, char, 
float,… được truyền theo tham trị.
32
 Các đối tượng muốn truyền qua mạng 
phải cài đặt giao tiếp Remote hoặc 
Serializable. Đối tượng cài đặt Remote 
sẽ truyền tham biến, cài đặt theo 
Serializable truyền theo tham trị.

File đính kèm:

  • pdfLập trình mạng - Chương 5_Lập trình mạng với Java.pdf
Tài liệu liên quan