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ÂN TRƯỜ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ụctiê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); } catch (IOException e) {
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 12public 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
// 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 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, receiveData.length);
// 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, receiveData.length);
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) (dùng RMI)
- Class TamGiacService:
package Cau_6;
import java.rmi.Remote;
import java.rmi.RemoteException;
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);
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();
// Đăng ký dịch vụ với tên "TriangleService"
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);