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.- Class Server: package Cau_1; import java.io.*; import java.net.*; public class Server { public static void
Trang 1TRƯỜNG ĐẠI HỌC DUY TÂNTRƯỜNG KHOA HỌC MÁY TÍNH
KHOA CÔNG NGHỆ THÔNG TIN
ĐỒ ÁN CÁ NHÂN MÔN HỌC:
CS420: HỆ PHÂN TÁN (J2EE, NET)
GIẢNG VIÊN HƯỚNG DẪN : NGUYỄN HỮU PHÚC
Trang 2PHẦN 1: LÝ THUYẾT
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?
Hệ phân tán là một hệ thống tính toán với các thành phần tính toá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.
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?
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.
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?
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.
Câu 4: Middleware là gì, kể tên 3 Middleware phổ biến?
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.
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?
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).
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?
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.
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?
Trang 3Stub 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 đó.
Câu 8: So sánh đồng hồ vật lý và đồng hồ logic?
Đồ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.
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?
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.
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?
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.
Trang 4PHẦN 2: THỰC HÀNH
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.
- 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
Trang 5public 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
Trang 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);
Trang 7Câ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:
a Số lượng ký tự, số lượng chữ số, số lượng chữ cái
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);
Trang 8while (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();
Trang 9for (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);
Trang 10public 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
Trang 12- Hình ảnh Client
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.
- 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) {
Trang 13try (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);
Trang 14public 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);
Trang 15BufferedReader 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);
Trang 17import 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) {
Trang 18// Kiểm tra xem một số có phải là số Fibonacci hay không private static boolean isFibonacci(int num) {
Trang 19import 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();
Trang 20} } }
- Hình ảnh Server
Trang 21- Hình ảnh Client
Câu 5: Client gởi cho Server 3 số a, b, c nhập từ bàn phím Yê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)
- 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) {
Trang 22try {
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();
Trang 23DatagramPacket 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ù";
Trang 24public 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);
Trang 25// Nhận và hiển thị kết quả từ Server byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData,
Trang 26- Hình ảnh Client
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ì (Vuông thường, Vuông cân, Cân, Đều, Thường hay không phải tam giác)
public interface TamGiacService extends Remote {
String classifyTriangle(double side1, double side2, double side3) throws RemoteException;
- Class TriangleServiceImpl:
Trang 27if (!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"; }
}
Trang 28private 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) {
Trang 29try {
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);
Trang 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);