Giới thiệu gói thư viện Java.net Một số lớp cần thiết trong gói thư viện java.net: InetAddress: quản lý địa chỉ Internet Socket: tạo kết nối từ client đến server ServerSocket: tạo
Trang 1Chương 5
LẬP TRÌNH MẠNG VỚI Java
(Gói thư viện Java.net)
Trang 3Giới thiệu gói thư viện Java.net
Một số lớp cần thiết trong gói thư viện
java.net:
InetAddress: quản lý địa chỉ Internet
Socket: tạo kết nối từ client đến server
ServerSocket: tạo kết nối từ phía server đến
ServerSocket: tạo kết nối từ phía server đến
Trang 4Lớp InetAddress
Sử dụng để quản lý địa chỉ host theo tên hay số
Các phương thức thường được sử dụng:
• static InetAddress getLocalHost() : trả về đối tượng
InetAddress là địa chỉ của máy cục bộ(localhost).
• static InetAddress getByName(String hostName):
trả về đối tượng InetAddress là địa chỉ của máy có tên là
trả về đối tượng InetAddress là địa chỉ của máy có tên là
hostName.
• static InetAddress[] getAllByName(String
hostName): trả về tất cả các đối tượng InetAddress là địa chỉ của máy có tên là hostName.
• byte[] getAddress(): trả về địa chỉ IP của đối tượng
InetAddress dưới dạng chuỗi byte.
• string getHostAddress(): trả về địa chỉ IP của đối tượng
Trang 5catch( UnknownHostException e){
System.out.println(“Address not found!”);
}
Trang 6Lớp Socket
Sử dụng cho client kết nối đến server
Các hàm tạo
• Socket(String hostName,int port): tạo đối tượng
socket và kết nối đến server hostName ở số hiệu cổng port.
• Socket(InetAddress address,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.
Trang 7Lớ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.
xuất để có thể gửi dữ liệu đến máy ở xa.
• 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.
Trang 8Lớ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()); DataOutputStream outStream=new DataOutputStream(mySocket.getOutputStream());
//Bắt đầu gửi nhận dữ liệu qua inStream và outStream …
}
catch(Exception e){
System.out.println(e);
}
Trang 9Lớ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
• ServerSocket(int port): tạo đối tượng socket và lắng
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.
Trang 10Lớ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();
//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);
}
Trang 11Lớ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
• DatagramSocket(): tạo đối tượng socket sử dụng giao thức
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.
Trang 12Lớ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
• 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.
Trang 13Lớ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;
DatagramPacket outDatagram;
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
Trang 14Lớ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.
• Object getContent(): lấy về nội dung từ địa chỉ URL có
đượ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ừ
Trang 15Lớp URL-Ví dụ
try{
//Tạo URL kết nối đến trang web
URL url=new URL(“http://www.hcmutrans.edu.vn/index.htm“);
//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 …
//In nội dung trang index.htm ra màn hình …
Trang 16Sử 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
server qua tên/địa chỉ IP và số hiệu cổng
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.
Trang 17Sử 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à
và gửi dữ liệu đến server qua địa chỉ và
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ụ
Trang 18RMI 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
Trang 19Khá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
đối tượng nằm trên một máy khác – triệu 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
Trang 20Khá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
Trang 21Gọ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
phương thức gọi từ xa, ở máy này con trỏ tồn 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ố
Trang 22Lớ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
Lớp trung gian tồn tại ở cả máy gọi
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
Trang 23Stub & Skeleton
Trang 24Xâ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 gọi từ xa
Trang 25B1 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.*;
import java.rmi.*;
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à
Trang 26B2 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){
Trang 27B3 Dịch thành các file class, tạo
Stub & Skeleton
Trang 28B4 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();
CalculatorImpl c=new CalculatorImpl();
Trang 29B5 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
Trang 30B6 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[]){
}
Trang 32Truyề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ị.
float,… được truyền theo tham trị.
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ị