






Preview text:
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA Công Nghệ Thông Tin BỘ MÔN: MẠNG & TT
ĐỀ THI VÀ BÀI LÀM - Đề 2
Tên học phần: Lập Trình Mạng Mã học phần:
Hình thfíc thi: Tự luận có giám sát
Thời gian làm bài: 60 phút (không kể thời gian phát đề và nộp bài)
Được sfí dụng tài liệu khi làm bài. Không chia sẻ bài cho nhau, nếu phát hiện sẽ chia đều số điểm.
Họ tên:Hoàng Công Trọng Lớp: 21TCLC-KHDL2 MSSV:102210333
Sinh viên làm bài trực tiếp trên tệp này, lưu tệp với định dạng MSSV_HọTên.pdf và nộp bài thông qua MSTeam:
Câu 1 (3 điểm): Hãy viết chương trình theo giao thfíc TCP với các chfíc năng sau: a) Client: a. Kết nối tới server
b. Tạo 1 số ngẫu nhiên n trong đoạn từ 2 đến 109
c. Lặp đi lặp lại các bước sau:
i. Gửi cho server 1 chuỗi thể hiện số nguyên n đã tạo.
ii. Nhận kết quả trả về từ server là 1 chuỗi thể hiện số nguyên m. Gọi t là số lượng số
nguyên số cùng nhau với n trong đoạn đoạn [1, n]. Kiểm tra xem tất cả các số từ m1 % n
đến mt % n có số nào trùng nhau hay không. Nếu có thì in ra “số m gửi về không hợp lệ”
quay lại bước i. Ngược lại thì in “Số m gửi về hợp lệ”, gửi cho server số “1” và nhảy tới bước d.
Ví dụ: n = 14, thì ta có t = 6 vì chỉ có 1,3, 5, 9, 11, 13 là nguyên tố cùng nhau với 14.
Nếu m trả về là 2 thì 21 % 14 == 24 % 14. Cần in ra “số 2 gửi về không hợp lệ”. Nhưng
nếu m trả về là 3 thì 31%14 != 32%14 != 33%14 != 34%14 != 35%14 != 36%14, vậy cần in
ra “Số 3 gửi về hợp lệ”. Gửi cho server số “1”. d. Đóng kết nối b) Server:
a. Lắng nghe và chấp nhận kết nối từ các client. Ứng với mỗi kết nối tạo 1 luồng xử lý sau:
i. Lặp đi lặp lại các bước sau không quá 10 lần:
Bước 1. Nhận 1 chuỗi thể hiện số nguyên n từ client gửi tới.
Bước 2. Nếu n == 1 thì nhảy tới ii
Bước 3. Hãy tìm hoặc đoán số nguyên m và gửi cho client số đó.
Bước 4. Quay về bước 1. ii. Đóng kết nối.
Yêu cầu, mỗi lần client gửi 1 chuỗi cho server, server phải phản hồi client trong vòng không quá 1 giây.
Nếu vòng lặp server chạy 10 lần vẫn không tìm hoặc đoán được số nguyên m thì không được điểm tối đa. # Trả lời:
Dán code server vào bên dưới package CK; import java.io.*; import java.net.*; public class server {
public static void main(String[] args) {
final int serverPort = 55555;
try (ServerSocket serverSocket = new ServerSocket(serverPort)) {
System.out.println("Server is listening on port " + serverPort); while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("New client connected");
new Thread(new ClientHandler(clientSocket)).start(); }
} catch (IOException e) { e.printStackTrace(); } }
private static class ClientHandler implements Runnable {
private final Socket clientSocket;
public ClientHandler(Socket socket) {
this.clientSocket = socket; } @Override public void run() {
try (BufferedReader in = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
for (int attempt = 0; attempt < 10; attempt++) {
String inputLine = in.readLine();
int n = Integer.parseInt(inputLine); if (n == 1) { break; } int m = guessM(n); out.println(m); }
} catch (IOException e) { e.printStackTrace(); } finally { try { clientSocket.close();
} catch (IOException e) { e.printStackTrace(); } } }
private int guessM(int n) {
return 2 + (int)(Math.random() * (n - 2)); } } }
Dán code client vào bên dưới package CK; import java.io.*; import java.net.*; import java.util.*; public class client {
public static void main(String[] args) {
final String serverAddress = "localhost";
final int serverPort = 55555;
Random random = new Random();
try (Socket socket = new Socket(serverAddress, serverPort);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new
InputStreamReader(socket.getInputStream()))) {
for (int attempt = 0; attempt < 10; attempt++) {
int n = 2 + random.nextInt(108); // [2, 109)
System.out.println("Gia tri cua n la: " + n); out.println(n);
String serverResponse = in.readLine();
int m = Integer.parseInt(serverResponse);
System.out.println("So nguyen m la: " + m);
int t = countCoprimes(n);
boolean isValid = true;
Set modValues = new HashSet<>();
for (int i = 1; i <= t; i++) { int mod = (m * i) % n;
if (!modValues.add(mod)) { isValid = false;
System.out.println("So " + m + " gui ve khong hop le"); break; } } if (isValid) {
System.out.println("So " + m + " gui ve hop le"); out.println("1"); break; } }
} catch (IOException e) { e.printStackTrace(); } }
private static int countCoprimes(int n) { int count = 0;
for (int i = 1; i < n; i++) {
if (gcd(i, n) == 1) { count++; } } return count; }
private static int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b); } }
Dán các kết quả thực thi vào bên dưới
Câu 2 (2 điểm): Hãy cho biết nếu chuyển chương trình ở câu 1 qua giao thfíc UDP thì các công việc cần làm
gồm nhfing gì? (Không cần code, chỉ cần mô tả) # Trả lời:
Câu 3 (5 điểm): Trong phần bài tập JSP/Servlet đã nộp
Đề bài tập: Có 1 tính toán lớn (chạy ngầm, ví dụ như xử lý dữ liệu lớn, xử lý video, convert pdf qua doc, xây
dựng mô hình học máy, kiểm tra đạo code, đạo văn tự động,...). Khi client gửi thông tin cần thực hiện xử lý,
server sẽ đẩy thông tin đó vào 1 hằng đợi để thực hiện. Client sẽ xem kết quả xử lý thông qua account của bản thân.
Hãy trả lời các câu hỏi sau:
a) Cho biết tên của các thành viên trong nhóm, kể cả bản thân
# Trả lời: viết câu trả lời vào bên dưới
Em làm một mình ạ. Tên của em là Hoàng Công Trọng
b) Mô tả chfíc năng chính mà bản thân đã đóng góp vào trong chương trình.
# Trả lời: viết câu trả lời vào bên dưới
- Chfíc năng login: Người dùng sẽ đăng nhập vào hệ thống với username và password,với 2 trường này
hệ thống sẽ kiểm tra đã có tài khoản chưa nếu có rồi thì cho đăng nhập và
em dùng session để lưu thông tin người dùng trong phiên làm việc, nếu chưa có thì người dùng phải
đăng ký. Các trường username và password sau khi được post tfi form đăng nhập
sẽ được chuyển đến UserLoginServlet, tfi đây sẽ gọi hàm login bên lớp UserService, và tfi lớp
UserService này sẽ gọi đến hàm checkLogin trong lớp UserDao để kiểm tra trong DataBase
- Chfíc năng đăng kí: Trong trường hợp người dùng chưa có tài khoản, họ sẽ tiến hành đăng kí, trong
form đăng kí user phải điền đầy đủ 3 thông tin đó là username, password, email sau đó khi người dùng
nhấn OK các giá trị sẽ được POST đến AddUserServlet, tfi đây sẽ gọi đến hàm registerUser trong lớp
UserService, và tfi lớp UserService này sẽ gọi đến hàm addUser trong lớp UserDao để thêm user vào DataBase
- Chfíc năng logout: Khi người dùng nhấn logout khỏi hệ thống thì nó sẽ gọi đến UserLogoutServlet, ở
chỗ này em sẽ tiến hành xoá thuộc tính "username" đã lưu trong session sau đó sẽ chuyển hướng đến
trang login của hệ thống.
- Chfíc năng dự đoán hình ảnh: Trong giao diện sau khi người dùng đã đăng nhập vào hệ thống, ở ô
bên trái user sẽ chọn một ảnh bất kì dưới máy tính của mình sau đó User sẽ nhấn button Predict để dự
đoán, sẽ có 2 thông tin user sẽ thấy ở ô bên phải đó là kết quả dự đoán và tỷ lệ dự đoán. Ở chfíc năng
này, đầu tiên là Model em đã dùng Flask API để deploy model của dưới local sau đó ở fíng dụng web
JSP-SERVLET của mình trong em sẽ gọi API tfi PredictImageServlet, tfi đây em sẽ gọi đến hàm
preidct trong lớp PredictService, trong phương thfíc này em sẽ chuyển ảnh thành mảng byte để làm đầu
vào cho API, sau đó sẽ nhận được phản tfi API bên phía FLASK. Sau khi nhận response tfi API em sẽ
lưu thông tin predict vào DataBase
- Chfíc năng xem danh sách dự đoán: Sau khi user đã có nhfing dự đoán, user có thể xem được lịch sfí
dự đoán của mình, khi user xem lịch sfí dự đoán thì nó sẽ gọi đến ListPredictServlet , tfi đây sẽ gọi
hàm listPreidct ở lớp PredictService, và tfi lớp PredictService sẽ gọi đến hàm getAllPredict bên trong
lớp PreictDao để truy vấn với DataBase
- Chúc năng xoá dự đoán: Người dùng có thể xoá nhfing dự đoán mà mình đã dự đoán, bằng cách vào
danh sách dự đoán sau đó bên phải mỗi predict đều có button delete, khi user nhấn delete thì hệ thống
sẽ gọi đến DeletePredictServlet, tfi đây sẽ gọi hàm deletePredict trong lớp PredictService, và tfi lớp
PredictService sẽ gọi đến hàm deletePredict trong lớp PredictDao để truy vấn với DataBase
c) Hãy mô tả cách thức để có thể xử lý một request với thời gian lớn mà không bị “request time out”. Hãy
trích tối đa 10 dòng code trong bài tập đã làm thể hiện điều đó! (có thể thêm comment nếu cần, nhưng
không được trích quá 10 dòng code)
# Trả lời: viết câu trả lời vào bên dưới
Đà Nẵng, ngày 12 tháng 12 năm 2023