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ụ:[r]
(1)Chương 5
1 LẬP TRÌNH MẠNG VỚI Java
(Gói thư viện Java.net)
Nội dung
Giới thiệu gói thư viện Java.net
Sử dụng TCP socket
Sử dụng UDP socket
2 RMI kỹ thuật phân tán đối tượng
Giới thiệu gói thư viện Java.net
Một số lớp cần thiết gói thư viện java.net:
InetAddress: quản lý địa 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
client
DatagramSocket: gửi nhận liệu dạng gói tin
DatagramPackage: gói tin chứa liệu gửi nhận sử dụng cho lớp DatagramSocket
URL: địa định vị tài nguyên mạng
Lớp InetAddress
Sử dụng để quản lý địa host theo tên hay số
Các phương thức thường sử dụng:
• static InetAddress getLocalHost() : trả đối tượng InetAddress địa máy cục bộ(localhost)
• static InetAddress getByName(String hostName):
trả đối tượng InetAddress địa máy có tên trả đối tượng InetAddress địa máy có tên hostName
• static InetAddress[] getAllByName(String
hostName): trả tất đối tượng InetAddress địa máy có tên hostName
• byte[] getAddress(): trả địa IP đối tượng InetAddress dạng chuỗi byte
(2)Lớp InetAddress(tt)-Ví dụ
try{
//Lấy đối tượng InetAddress chứa thông tin về máy chủ
InetAddress host=
InetAddress.getByName(“www.hcmutrans.edu.vn”);
5 Sytem.out.println(“Host Name :”+host.getHostName()); Sytem.out.println(“IP Address:”+host.getHostAddress()); }
catch( UnknownHostException e){
System.out.println(“Address not found!”); }
Lớ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 kết nối đến server hostName số hiệu cổng port
6
• Socket(InetAddress address,int port): tạo đối tượng socket kết nối đến address port
• Socket(String hostName, int port, boolean stream): tạo đối tượng socket kết nối đến hostName port, stream=true qui định kết nối theo TCP, stream=false qui định kết nối theo UDP Tuy nhiên sử dụng socket theo UDP nên sử dụng lớp DatagramSocket
Lớp Socket(tt)
Các phương thức thường sử dụng:
• InputStream getInputStream() : lấy luồng nhập để nhận liệu từ máy xa
• OutputStream getOutputStream(): lấy luồng xuất để gửi liệu đến máy xa
xuất để gửi liệu đến máy xa
• InetAddress getInetAddress(): trả đối tượng InetAddress chứa địa máy kết nối đến
• int getPort(): trả số hiệu cổng sử dụng máy 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()); DataOutputStream outStream=new DataOutputStream(mySocket.getOutputStream());
//Bắt đầu gửi nhận dữ liệu qua inStream outStream …
}
(3)Lớp ServerSocket
Sử dụng cho server, tạo socket lắng nghe kết nối port
Hàm tạo phương thức:
• ServerSocket(int port): tạo đối tượng socket lắng
9
• ServerSocket(int port): tạo đối tượng socket lắng nghe port
• Socket accept(): dừng lại đợi client kết nối đến, nhận thông tin kết nối trả đối tượng Socket kết nối với client
• void close(): cắt kết nối đó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 OutputStream qua socket client // 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 liệu dạng gói tin.
Hàm tạo 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 kết nối đến số hiệu cổng port
• void send(DatagramPacket p): gửi gói tin p • void receive(DatagramPacket p): nhận gói tin p • void close(): đóng socket
Lớp DatagramPacket
Khai báo gói tin gửi mạng qua kết nối
DatagramSocket
Hàm tạo phương thức:
• DatagramPacket(byte buffer[], int len): tạo gói tin có liệu chứa buffer, chiều dài buffer len • DatagramPacket(byte buffer[], int len,
InetAddress dest, int port): tạo gói tin gửi đến địa dest với số hiệu cổng port
• InetAddess getAddress(): lấy địa chứa gói tin • int getPort(): lấy số hiệu cổng chứa gói tin • byte[] getData(): lấy liệu gói tin
(4)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 nhận DatagramPacket outDatagram;
13
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 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 phương thức:
• URL(String s): tạo đối tượng URL từ địa s chuỗi
: lấy nội dung từ địa URL có
14 • Object getContent(): lấy nội dung từ địa URL có
được
• String getFile(): lấy tên tập tin nằm chuỗi địa 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(“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 hình … //In nội dung trang index.htm hình …
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 đối tượng ServerSocket lắng nghe đến số hiệu cổng
Client: tạo đối tượng Socket kết nối với server qua tên/địa IP số hiệu cổng server qua tên/địa IP số hiệu cổng
Tham khảo hai ví dụ:
TimeServer/TimeClient: server phục vụ truy vấn
ngày
CalServer/CalClient: Server phục vụ chức
(5)Sử dụng UDP socket
Server: tạo đối tượng DatagramSocket lắng nghe đến số hiệu cổng
Client: tạo đối tượng DatagramSocket gửi liệu đến server qua địa
17
và gửi liệu đến server qua địa cổng biết trước Server gửi trả liệu qua địa cổng client chứa gói tin
Tham khảo ví dụ:
CurrencyServer/CurrencyClient: server phục vụ
truy vấn giá ngoại tệ
RMI 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
Vấn đề truyền tham số
Kết nối mạng 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 máy vật lý khác
Đối tượng triệu gọi phương thức đối tượng nằm máy khác – triệu đối tượng nằm máy khác – triệu gọi từ xa
RMI (Remote method Invoke): cách thức giao tiếp đối tượng Java có mã lệnh cài đặt nằm máy khác triệu gọi lẫn
Khái niệm lập trình phân tán đối tượng(tt)
Computer A
A1
A2
+ A1, A2 đối tượng máy A + B1 đối tượng máy B
+ C1,C2,C3 đối tượng máy C
Computer B
B1 A2
Computer C C1 C2
C3
(6)B1 Tạo interface Calculator
Interface Calculator cần kế thừa lớp Remote để có
thể gọi từ xa
File Calculator.java có nội dung sau
import java.rmi.*;
25
import java.rmi.*;
public interface Calculator extends Remote{ public int sum(int n);
// sum = 1+2+3+…+n }
//Chỉ khai báo phương thức //đối số, khơng có nội dung.
B2 Tạo lớp CalculatorImpl 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 file class, tạo Stub & Skeleton
C:\>javac Calculator.java C:\>javac CalculatorImpl.java C:\>rmic CalculatorImpl
Kết trình dịch 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(); CalculatorImpl c=new CalculatorImpl(); 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); }
(7)B5 Thực thi đăng ký đối tượng rmiregistry.exe
Chức đăng ký đón nhận kết nối chứa thông tin đối tượng phương thức Naming.bind() gửi đến
Kích hoạt đăng ký:
29
Kích hoạt đăng ký:
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
//Test c
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 file sau:
Calculator.class
CalculatorImpl.class
CalculatorImpl_Skel.class
CalculatorImpl_Stub.class
CalculatorServer.class
Trên Client cần file sau:
Calculator.class
CalculatorImpl_Stub.class
CalculatorClient.class
Truyền tham số lời gọi phương thức từ xa
Tham số: tham trị tham biến
Tham số RMI:
Các kiểu liệu đơn giản như: int, char, float,… truyền theo tham trị
float,… 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
Serializable Đối tượng cài đặt Remote