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
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:
Lập trình mạng - Chương 5_Lập trình mạng với Java.pdf

