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]
Trang 1Chuong 5
LẬP TRÌNH MẠNG VỚI Java
(Gói thư viện Java.net)
Nội dung
L1 Giới thiệu gói thư viện Java.net L1 Sử dụng TCP socket
L1 Sử dụng UDP socket L1 RMI và kỹ thuật phần tán đối tượng
Giới thiệu gói thư viện Java.net
L1 Một số lớp cần thiết trong gói thư viện
java.net:
m InetAddress: quan ly dia chi Internet m™ Socket: tao két ndi tu client dén server
m ServerSocket: tao kết nối từ phía server đến
client
m DatagramSocket: gửi nhận dữ liệu dưới dạng gói tin
= DatagramPackage: gói tin chứa dữ liệu gửi nhận sử dụng cho lớp DatagramSocket
m URL: địa chỉ định vị tài nguyên trên mang
H Sử dụng để quản lý địa chỉ host theo tên hay số
O Các phương thức thường được sử dụng:
° staEic InetAddress getLocalHost() : trả về đối tượng
TnetAddress 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à hostName
* static InetAddress[] getAllByName (Str1ng
hostName) : trả về tất cả các đối tượng TnetAddress là địa chỉ của máy có tên là hostName
- - byte[] getAddress () : trả về địa chỉ ïP của đối tượng TnetAddress dưới dạng chuối byte
- = string getHostAddress () : (rả về địa chỉ IP của đối tượng
TnetAddress dưới dạng string
Trang 2
Lớp InetAddress(tt)-Ví dụ
try{
⁄/Lây đôi tượng TnetAddress chúa thông tin về máy chủ InetAddress host=
InetAddress.getByName (“www.hcmutrans.edu.vn”);
Sytem.out.printin(“Host Name : ”+hostE.getHostName () ) ; Sytem.out.printin(“IP Address:”+host.getHostAddress());
}
catch( UnknownHostException e) {
System.out.printin(“Address not found!”);
Lớp Socket
Sử dụng cho client kết nối đến server L1 Các hàm tạo
* Socket(String hostName,inE port): tạo đối tượng socket và kết nối đến server hostName ở số hiệu cổng port
° Socket(TnetAddress address,int port): tạo đối tượng socket kết nối đến address va 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)
L1 Các phương thức thường được sử dụng:
°Ồ InputStream getInputStream() : /ay luéng
nhập để có thể nhận dữ liệu từ máy ở xa
* OutputStream getOutputStream(): /ay luông
xuất để có thể gửi dữ liệu đến máy ở xa
* TnetAddress getTnetAddress () : trả về đối
tượng TnetAddress chứa địa chỉ của máy đang kết nối đến
- inE 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
try{
⁄⁄Kêt nỗi đễn máy chù
Socket mySocket=new Socket (“www.hcmutrans.edu.vn”, 8080);
⁄/Luông nhập dé nhaén di liệu
DataInputStream inStream=new DataInputStream(mySocket.getInputStream());
/⁄/Luông xuật đề gửi đữ liệu
DataOutputStream outStream=new DataOutputStream (mySocket.getOutputStream());
//Bat dau gui nhận dữ liệu gua inStream và ouEStream
}
catch(Exception e){
System.out.printin(e);
}
Trang 3
Lớp ServerSocket
L1 Sử dụng cho server, tao socket va lang
nghe kết nối trên một port L1 Hàm tạo và các phương thức:
-Ổ = ServerSocket(int port): tạo đối tượng socket và lắng
nghe G port
* Socket accept ()! dung lại và đợi client kết nối đến, khi
nhận được thông tín 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);
//Cho client két néi dén
Socket client=server.accept ();
//Tao InputStream va OutputStream qua socket client
⁄Z_ và bắt đầu gửi nhận đũữ liệu
} catch (Exception e) { System.out.printin(e);
10
Lớp DatagramSocket
L1 Sử dụng giao thức UDP, truyén nhận dữ
liệu dưới dạng gói tin
L1 Hàm tạo và các phương thức:
- = DatagramSocket(): tạo đối tượng socket sử dụng giao thức
UDP
* DatagramSocket (int port)! tao déi tuong socket va 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
1 Khai báo gói tin gửi đi trên mạng qua kết nối DatagramSocket
1 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 bu£f£fer, chiều dài buffer là 1en
* DatagramPacket (byte buffer[], int len,
InetAddress dest, int port): tao gdi tin gui dén dia chi
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
- = inE getLength(): lấy chiều dài gói dữ liệu
12
Trang 4Lớ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 Bu£fer gửi nhận
byte outBuffer[];
byte inBuffer[]=new byte[256];
//Khai bdo Datagram Packet để gửi và nhận
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); // xu ly d@ 116u 6 inBuffer
⁄⁄ chudn bi dt 1iéu trong outDatagram
⁄⁄ gủi dũ liệu:
socket.send (outDatagram) ;
}
catch(Exception e) {
System.out.printin(e);
}
13
Lớp URL
1 URL(Uniform Resource Locator): sử dụng để định vị tài nguyên mạng
L1 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
chi URL
* String getHost(): lay tén may chu
* int getPort(): lay số hiệu cổng
* InputStream openStream(): md ludng dé doc théng tin từ máy chủ
14
Lớp URL-Ví dụ
try{
//Tao URL két néi dén trang web
URL url=new URL (“http://www.hcmutrans.edu.vn/index.htm”);
/⁄/Tạo luông nhập để đọc đữ liệu
BufferReader inStream=new BufferReader (new
InputStreamReader (url.openStream()));
//In nội dung trang index.htm ra man hình
String s;
while ((s=inStream.readLine())!=null) {
System.out.printlin(s);
}
}
catch (Exception e) {
System.out.printin(e);
}
15
Su dung TCP socket
1 Server: tạo một đối tượng ServerSocket lãng nghe đến một số hiệu cổng nào đó
L1 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
L1 Tham khảo hai ví dụ:
ã TimeServer/TimeClient: server phục vụ truy van ngày giờ
m CalServer/CalClient: Server phục vụ chức năng
tính toán
Trang 5
Su dung UDP socket
O Server: tạo một đối tượng DatagramSocket
lắng nghe đến một số hiệu cổng nào đó
1 Client: tạo một đối tượng DatagramSocket
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
L1 Tham khảo ví dụ:
m CurrencyServer/CurrencyClient: server phuc vu
truy van gia ca ngoai té
RMI va ky thuat lap trinh phan tan đối tượng
L1 Khái niệm lập trình phan tán đối tượng
L1 Thiết kế ứng dụng phần tán RMI L1 Vấn đề truyền tham số
L1 Kết nối mạng và vấn đề tường lửa(firewall)
CL) SOAP
17 18
Khai niém lap trinh phan tan doi
tượng
H Các đối tượng nằm phân tán trên các máy
vật lý khác nhau
1 Đố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 gọi từ xa
O RMI (Remote method Invoke): la cach thuc
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 phan tan doi
tượng(tt)
+ A1, A2 là các đối
Computer A tượng trên máy A
+ BI là đối tượng trên
> a may B
a + C1,C2,C3 là các đối
tượng trên máy C
Computer B
»
19 20
Trang 6B1 Tao interface Calculator
O Interface Calculator can ké thừa lớp Remote để có
thể gọi được từ xa
O File Calculator.java có nội dung như sau
import java.rmi.*;
public interface Calculator extends Remote {
public int sum(int n);
// sum = 1+2+3+ Tn
}
⁄/Chỉ khai báo các phương thúc và
/⁄/đôi sô, không có nội dung
25
B2 Tạo lớp CalculatorTmpl hiện
thực interface Calculator
L1 File CalculatorImpl.java có nội dung:
import java.rmi.*;
public class CalculatorImpl implements Calculator {
public int sum(int n) { int s=0;
for (int i=l1;i<n;i++)
s=st+i;
return Ss;
26
B3 Dich thanh cac file class, tao
Stub & Skeleton
C:\>javac Calculator.java
C:\>javac CalculatorImpl.java
C:\>rmic CalculatorImpl
L1 Kết quả quá trình dịch được các file:
m Calculator.class
m CalculatorTmpl.class
m CalculatorTmpl_ Stub.class
m CalculatorTmpl_ Skel.class
27
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();
System.out.printin("Exporting Calculator ");
UnicastRemoteObject.exportObject(c);
Naming.bind("rmi://localhost/MyCalculator",c);
System.out.printin("Register Calculator!");
}catch(Exception e){
System.out.printin(e);
3
t +
Trang 7
B5 Thuc thi bo dang ky doi tudng
rmiregistry.exe
L1 Chức nang 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
L1 Kích hoạt bộ đăng ky:
C:\jsdk\bin\rmiregistry.exe
O Kich hoat CalculatorServer:
java CalculatorServer
29
B6 Xay dung CalculatorClient.java
su dung doi tudng Calculator
import java.rmi.*;
public class CalculatorClient{
public static void main(String args[]){
try{
System.out.printIn("Finding Object ");
Calculator c=(Calculator)Naming.lookup(“rmi://localhost/MyCalculator");
//Test c System.out.printiIn(’Sum(12)= " + c.sum(12));
}catch(Exception e)4
System.out.printin(e);
}
Ỳ +
30
Triển khai ứng dụng
L1 Trên Server cần các file sau:
Calculator.class
m CalculatorTmpl.class
m CalculatorImpl_Skel.class
m CalculatorTImpl_ Stub.class
m CalculatorServer.class L1 Trên Client cần các file sau:
m Calculator.class
m CalculatorTImpl_ Stub.class
m CalculatorClient.class
phương thức tử xa
L1 Tham số: tham trị và tham biến
LI Tham số trong RMI:
m Các kiểu dữ liệu đơn giản như: int, char,
float, được truyền theo tham trị
m Các đối tượng muốn truyén qua mang 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ị
32