Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.81 MB, 30 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
<b>TRƯỜNG ĐẠI HỌC DUY TÂNTRƯỜNG KHOA HỌC MÁY TÍNH</b>
<b>KHOA CƠNG NGHỆ THƠNG TIN</b>
<b>ĐỒ ÁN CÁ NHÂN MÔN HỌC: </b>
<b>GIẢNG VIÊN HƯỚNG DẪN : NGUYỄN HỮU PHÚC</b>
</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2"><b>PHẦN 1: LÝ THUYẾT</b>
<b>Câu 1: Hệ phân tán là gì? Ví dụ về một số mơ hình hoặc ứng dụng của hệ phân tán?</b>
Hệ phân tán là một hệ thống tính tốn với các thành phần tính tốn được phân bố trên các vị trí địa lý khác nhau. Đây là tập hợp các máy tính độc lập, khơng phụ thuộc lẫn nhau, kết nối với nhau bằng một hạ tầng truyền thơng. Ví dụ về mơ hình hệ phân tán có thể là mơ hình client-server, mơ hình peer-to-peer (P2P), hoặc mơ hình hybrid.
<b>Câu 2: Phân biệt giữa chuyển mạch kênh và chuyển mạch gói, ưu và nhược điểm của 2 loại này?</b>
Chuyển mạch kênh sử dụng cách tiếp cận hướng kết nối trong đó liên kết mạng được dành riêng cho một kết nối tại một thời điểm và không người dùng nào khác được phép sử dụng mạch đó. Ngược lại, chuyển mạch gói phân chia dữ liệu được truyền thành các đơn vị nhỏ gọi là các gói khơng có sự bảo lưu từ đầu đến cuối của các liên kết mạng.
<b>Câu 3: Nêu và cho ví dụ về các yếu tố ảnh hưởng đến sự ra đời của hệ phân tán?</b>
Một số yếu tố ảnh hưởng đến sự ra đời của hệ phân tán bao gồm nhu cầu tăng không ngừng việc chia sẻ tài nguyên và thông tin, việc giá các trạm làm việc giảm nhanh chóng, và việc sử dụng rộng rãi các mạng.
<b>Câu 4: Middleware là gì, kể tên 3 Middleware phổ biến?</b>
Middleware là một loại phần mềm trung gian trên máy tính, nó được dùng để có thể kết nối với những phần mềm khác được dễ dàng, tiện lợi hơn. Ba ví dụ về middleware phổ biến có thể là Oracle Fusion Middleware, IBM WebSphere và Microsoft .NET.
<b>Câu 5: Socket là gì, Socket hoạt động trên các giao thức nào, có các loại Socket nào phổ biến?</b>
Socket được coi là một cổng giao tiếp giữa các ứng dụng trên mạng. Nó cho phép các thiết bị trao đổi thông tin với nhau thông qua một kết nối định sẵn. Socket hoạt động trên các giao thức như TCP (Transmission Control Protocol) và UDP (User Datagram Protocol). Có hai loại socket phổ biến là stream sockets (sử dụng TCP) và datagram sockets (sử dụng UDP).
<b>Câu 6: Giới thiệu về các giao thức TCP, UDP trong lập trình hệ phân tán?</b>
TCP (Transmission Control Protocol) và UDP (User Datagram Protocol) là hai giao thức quan trọng trong lập trình hệ phân tán. TCP là giao thức kết nối hướng kết nối và cung cấp truyền thông hai chiều tin cậy giữa hai máy tính. UDP là giao thức khơng kết nối và khơng đảm bảo việc giao hàng; nó chỉ gửi datagram từ nguồn đến điểm đích.
<b>Câu 7: Mơ tả Stub – Skeleton trong lập trình thủ tục triệu gọi từ xa trong hệ phân tán?</b>
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">Stub và Skeleton là hai thành phần quan trọng trong lập trình thủ tục triệu gọi từ xa (Remote Procedure Call - RPC) trong hệ phân tán. Stub là phần của RPC nằm ở máy khách (client), nó chịu trách nhiệm gửi yêu cầu từ máy khách tới máy chủ. Skeleton nằm ở máy chủ (server), nó nhận yêu cầu từ Stub và sau đó thực hiện yêu cầu đó.
<b>Câu 8: So sánh đồng hồ vật lý và đồng hồ logic?</b>
Đồng hồ vật lý là gần tương đương với đồng hồ thời gian thực toàn cục. Việc đo khoảng thời gian là hữu ích và nhận được trực tiếp từ đồng hồ vật lý. Đồng hồ logic không phản ánh thời gian thực tế, nhưng nó giúp xác định thứ tự các sự kiện trong hệ thống phân tán.
<b>Câu 9: Nêu trình tự các bước thiết kế một ứng dụng phân tán với JAVA?</b>
Thiết kế một ứng dụng phân tán với Java bao gồm các bước như xác định yêu cầu và mục tiêu của ứng dụng, thiết kế kiến trúc và mơ hình dữ liệu, chọn cơng nghệ và framework phù hợp (ví dụ: Java RMI, Java EE), lập trình và kiểm thử các thành phần của ứng dụng.
<b>Câu 10: Nêu quy trình các phương thức/hàm xử lý khi truyền dữ liệu qua kỹ thuật RMI?</b>
Quy trình các phương thức/hàm xử lý khi truyền dữ liệu qua kỹ thuật RMI (Remote Method Invocation) bao gồm việc khởi tạo kết nối giữa client và server, gọi phương thức từ xa thông qua stub, truyền dữ liệu qua mạng, và nhận kết quả trả về từ server.
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4"><b>PHẦN 2: THỰC HÀNH</b>
<b>Câu 1: Client nhập lần lượt 2 số nguyên a và b từ bàn phím và gởi cho Server. Yêu cầu Server tính tổng a+b. Viết chương trình hiển thị kết quả này trên màn hình Client theo kỹ thuật TCP.</b>
- Class Server: package Cau_1; import java.io.*; import java.net.*; public class Server {
public static void main(String[] args) { int port = 12345; // Cổng kết nối
try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("Server đang lắng nghe trên cổng " + port); while (true) {
try (Socket clientSocket = serverSocket.accept()) { System.out.println("Đã kết nối với " + clientSocket.getRemoteSocketAddress()); // Tạo luồng vào và ra
BufferedReader in = new BufferedReader(new
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">public class Client {
public static void main(String[] args) {
String serverAddress = "127.0.0.1"; // Địa chỉ IP của máy chủ int serverPort = 12345; // Cổng kết nối
try (Socket socket = new Socket(serverAddress, serverPort)) { // Tạo luồng vào và ra
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">// Nhận và hiển thị kết quả từ Server String result = in.readLine();
System.out.println("Tổng của " + a + " và " + b + " là: " + result);
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7"><b>Câu 2: Client gửi 1 đoạn ký tự (bao gồm số và chữ) cho Server. Yêu cầu Server gửi trả lại các thông tin theo kỹ thuật TCP các yêu cầu sau: </b>
<b>a. Số lượng ký tự, số lượng chữ số, số lượng chữ cái</b>
public class Server {
public static void main(String[] args) { int port = 12345; // Cổng kết nối
try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("Server đang lắng nghe trên cổng " + port);
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">while (true) {
try (Socket clientSocket = serverSocket.accept()) { System.out.println("Đã kết nối với " + clientSocket.getRemoteSocketAddress()); // Tạo luồng vào và ra
BufferedReader in = new BufferedReader(new
// a. Số lượng ký tự, số lượng chữ số, số lượng chữ cái int charCount = inputLine.length();
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">for (char c : inputLine.toCharArray()) { charCounts[c]++;
}
// c. Hiển thị dãy ký tự đảo ngược
StringBuilder reverseString = new StringBuilder(inputLine).reverse(); // Gửi các thông tin về Client
out.println("Số lượng ký tự: " + charCount); out.println("Số lượng chữ số: " + digitCount); out.println("Số lượng chữ cái: " + letterCount);
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">public class Client {
public static void main(String[] args) {
String serverAddress = "127.0.0.1"; // Địa chỉ IP của máy chủ int serverPort = 12345; // Cổng kết nối
try (Socket socket = new Socket(serverAddress, serverPort)) { // Tạo luồng vào và ra
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new String input = userInput.readLine(); // Gửi dữ liệu đến Server out.println(input);
// Nhận và hiển thị thơng tin từ Server
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">- Hình ảnh Client
<b>Câu 3: Client nhập cho a,b,c và gửi cho Server theo kỹ thuật TCP. Server xử lý và trả lại các nghiệm có thể có của phương trình bậc 2.</b>
- Class Server: import java.io.*; import java.net.*; public class Server {
public static void main(String[] args) { int port = 12345; // Cổng kết nối
try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("Server đang lắng nghe trên cổng " + port);
while (true) {
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">try (Socket clientSocket = serverSocket.accept()) { System.out.println("Đã kết nối với " + clientSocket.getRemoteSocketAddress());
// Tạo luồng vào và ra
BufferedReader in = new BufferedReader(new
// Chuyển đổi chuỗi đầu vào thành các số a, b, c String[] parts = inputLine.split(",");
double x1 = (-b + Math.sqrt(delta)) / (2 * a); double x2 = (-b - Math.sqrt(delta)) / (2 * a);
out.println("Nghiệm x1 = " + x1 + ", Nghiệm x2 = " + x2); } else if (delta == 0) {
double x = -b / (2 * a);
out.println("Nghiệm kép x = " + x);
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">public class Client {
public static void main(String[] args) {
String serverAddress = "127.0.0.1"; // Địa chỉ IP của máy chủ int serverPort = 12345; // Cổng kết nối
try (Socket socket = new Socket(serverAddress, serverPort)) { // Tạo luồng vào và ra
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // Nhập a, b, c từ bàn phím
BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Nhập a, b, c (cách nhau bằng dấu phẩy): "); String input = userInput.readLine();
// Gửi dữ liệu đến Server out.println(input);
// Nhận và hiển thị nghiệm từ Server String result = in.readLine();
System.out.println("Kết quả: " + result);
</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">import java.io.*; import java.net.*; public class Server {
public static void main(String[] args) { int port = 12345; // Cổng kết nối
try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("Server đang lắng nghe trên cổng " + port); while (true) {
try (Socket clientSocket = serverSocket.accept()) { System.out.println("Đã kết nối với " + clientSocket.getRemoteSocketAddress());
// Tạo luồng vào và ra
BufferedReader in = new BufferedReader(new
int num = Integer.parseInt(inputLine); boolean isFibonacci = isFibonacci(num);
// Gửi kết quả về Client if (isFibonacci) {
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">// Kiểm tra xem một số có phải là số Fibonacci hay khơng private static boolean isFibonacci(int num) {
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">import java.io.*; import java.net.*; public class Client {
public static void main(String[] args) {
String serverAddress = "127.0.0.1"; // Địa chỉ IP của máy chủ int serverPort = 12345; // Cổng kết nối
try (Socket socket = new Socket(serverAddress, serverPort)) { // Tạo luồng vào và ra
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new String input = userInput.readLine();
// Gửi dữ liệu đến Server out.println(input);
// Nhận và hiển thị kết quả từ Server String result = in.readLine();
System.out.println("Kết quả từ Server: " + result); } catch (IOException e) {
e.printStackTrace();
</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">} } }
- Hình ảnh Server
</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">- Hình ảnh Client
<b>Câu 5: Client gởi cho Server 3 số a, b, c nhập từ bàn phím. u cầu Server cho biết chúng có tạo thành 3 cạnh của tam giác hay không, nếu có thì đó là tam giác gì? (dùng UDP)</b>
- Class Server: import java.net.*; import java.io.*;
public class UDPServer {
public static void main(String[] args) { int port = 12345; // Cổng kết nối
try (DatagramSocket socket = new DatagramSocket(port)) { System.out.println("Server đang lắng nghe trên cổng " + port); while (true) {
</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">try {
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData,
// Gửi kết quả về Client
InetAddress clientAddress = receivePacket.getAddress(); int clientPort = receivePacket.getPort();
byte[] sendData = response.getBytes();
</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);
// Kiểm tra xem ba số a, b và c có tạo thành tam giác hay khơng private static boolean isTriangle(double a, double b, double c) { return (a + b > c) && (a + c > b) && (b + c > a);
}
// Xác định loại tam giác (nhọn, tròn, tù)
private static String getTriangleType(double a, double b, double c) { double maxSide = Math.max(Math.max(a, b), c);
double sumOfSquares = a * a + b * b + c * c - maxSide * maxSide; if (sumOfSquares > maxSide * maxSide) {
return "Tam giác nhọn";
} else if (sumOfSquares < maxSide * maxSide) { return "Tam giác tù";
</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">public class UDPClient {
public static void main(String[] args) {
String serverAddress = "127.0.0.1"; // Địa chỉ IP của máy chủ int serverPort = 12345; // Cổng kết nối
try (DatagramSocket socket = new DatagramSocket()) { // Nhập a, b, c từ bàn phím
BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Nhập a, b, c (cách nhau bằng dấu phẩy): "); String input = userInput.readLine();
// Gửi dữ liệu đến Server byte[] sendData = input.getBytes();
InetAddress serverAddressInet = InetAddress.getByName(serverAddress); DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length, serverAddressInet, serverPort); socket.send(sendPacket);
</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">// Nhận và hiển thị kết quả từ Server byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData,
</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">- Hình ảnh Client
<b>Câu 6: Client gửi cho cho Server độ dài của 3 cạnh. Server phản hồi lại đây là tam giác gì (Vng thường, Vng cân, Cân, Đều, Thường hay không phải tam giác) </b>
public interface TamGiacService extends Remote {
String classifyTriangle(double side1, double side2, double side3) throws RemoteException;
- Class TriangleServiceImpl:
</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">if (!isValidTriangle(side1, side2, side3)) { return "Không phải tam giác"; }
if (isEquilateral(side1, side2, side3)) { return "Tam giác đều";
} else if (isIsosceles(side1, side2, side3)) { return "Tam giác cân";
} else if (isRightTriangle(side1, side2, side3)) { return "Tam giác vuông";
} else {
return "Tam giác thường"; }
}
</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">private boolean isValidTriangle(double side1, double side2, double side3) { return (side1 + side2 > side3) && (side1 + side3 > side2) && (side2 + side3 > side1);
}
private boolean isEquilateral(double side1, double side2, double side3) { return (side1 == side2) && (side2 == side3);
}
private boolean isIsosceles(double side1, double side2, double side3) { return (side1 == side2) || (side1 == side3) || (side2 == side3); }
private boolean isRightTriangle(double side1, double side2, double side3) { double[] sides = { side1, side2, side3 };
public class Server {
public static void main(String[] args) {
</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">try {
int port = 1099; // Cổng RMI LocateRegistry.createRegistry(port);
// Tạo đối tượng dịch vụ
TriangleService triangleService = new TriangleServiceImpl(); public class Client {
public static void main(String[] args) {
String serverAddress = "rmi://127.0.0.1/TriangleService"; try {
TriangleService triangleService = (TriangleService) Naming.lookup(serverAddress);
</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">// Nhập độ dài của 3 cạnh từ bàn phím double side1 = 5.0;
double side2 = 4.0; double side3 = 3.0;
// Gọi phương thức từ Server và hiển thị kết quả
String result = triangleService.classifyTriangle(side1, side2, side3); System.out.println("Kết quả từ Server: " + result);
</div>