








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: Võ Đình Hải Lớp: 22T_DT4 MSSV:102220186
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 (4 điểm): Hãy viết chương trình theo giao thfíc TCP với các chfíc năng sau: I.
Client (xem yêu cầu a,ii để thiết kế giao diện cho phù hợp):
+ Kết nối và gửi tới server 1 chuỗi “Please livestream”:
a. Nếu nhận được chuỗi “OK” thì lặp đi lặp lại các bước sau:
i. Gửi cho server chuỗi “Get Video”
ii. Nhận từ server mảng byte chứa thông tin hình ảnh và dùng Graphics để hiển thị hình ảnh đã nhận.
b. Nếu không nhận được chuỗi “OK” hoặc quá 10s không thấy phản hồi thì kết thúc chương trình. II. Server:
+ Tạo 1 danh sách tĩnh các client không cho phép kêt nối.
Ví dụ: BlackList:[“192.168.10.100”, :[“192.168.10.105”]
+ Lắng nghe và chấp nhận kết nối từ nhiều client nếu IP không thuộc các địa chỉ không cho phép.
+ Nhận từ client đã kết nối 1 chuỗi, kiểm tra chuỗi đó có phải là:
a. Nếu là “Please livestream” thì phản hồi cho client chuỗi “OK”.
b. Nếu là “Get Video” thì gửi gửi mảng byte chứa thông tin hình ảnh màn hình server cho client. Lưu ý:
1. Tối ưu quá trình livestream để không phải chụp màn hình nhiều lần nếu có nhiều client kết nối tới.
2. Nếu client ngắt kết nối đột ngột cần xử lý loại bỏ kết nối để không phải lưu trữ thông tin client đó.
# Trả lời:
Dán code server vào bên dưới package Server; import java.awt.*;
import java.awt.image.BufferedImage; import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ConcurrentHashMap;
import javax.imageio.ImageIO;
public class Server1 {
private static ConcurrentHashMap clients = new ConcurrentHashMap<>();
private static BufferedImage currentImage = null;
public static void main(String[] args) { int port = 1111;
String[] blackList = {"192.168.10.100", "172.20.10.6"}; new Thread(() -> { try {
Robot robot = new Robot();
Rectangle screenRect = new
Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); while (true) {
currentImage = robot.createScreenCapture(screenRect); Thread.sleep(200); }
} catch (Exception e) { e.printStackTrace(); } }).start();
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("Server is running..."); while (true) {
Socket socket = serverSocket.accept();
String clientIP = socket.getInetAddress().getHostAddress();
boolean isBlacklisted = false;
for (String ip : blackList) {
if (clientIP.equals(ip)) { isBlacklisted = true; break; } } if (isBlacklisted) {
System.out.println("Rejected connection from blacklisted IP: " + clientIP); socket.close(); } else {
ClientHandler handler = new ClientHandler(socket);
clients.put(clientIP, handler);
new Thread(handler).start(); } }
} catch (IOException e) { e.printStackTrace(); } }
static class ClientHandler implements Runnable { private Socket socket;
private DataOutputStream dos;
private DataInputStream dis;
private String clientIP;
public ClientHandler(Socket socket) { this.socket = socket;
this.clientIP = socket.getInetAddress().getHostAddress(); try {
this.dos = new DataOutputStream(socket.getOutputStream());
this.dis = new DataInputStream(socket.getInputStream());
} catch (IOException e) { e.printStackTrace(); } } @Override
public void run() { try { while (true) {
String request = dis.readUTF();
if ("Please livestream".equals(request)) {
System.out.println("Nhận được: " + request ); dos.writeUTF("OK");
System.out.println("Gư‘ i lại: OK"); dos.flush();
} else if ("Get Video".equals(request)) {
System.out.println("Nhận được: " + request);
if (currentImage != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(currentImage, "png", baos);
byte[] imageBytes = baos.toByteArray();
dos.writeInt(imageBytes.length); dos.write(imageBytes);
System.out.println("Đã g ư ‘i chiều
` dài m ‘a n g Byte + m ‘ang Byte"); dos.flush(); } } }
} catch (IOException e) {
System.out.println("Client " + clientIP + " disconnected."); } finally {
clients.remove(clientIP); try {
if (dis != null) dis.close();
if (dos != null) dos.close();
if (socket != null) socket.close();
} catch (IOException e) { e.printStackTrace(); } } } } }
Dán code client vào bên dưới package Client;
import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*;
import java.awt.image.BufferedImage; import java.io.*;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class Client1 {
public static void main(String[] args) { try {
Socket socket = new Socket("172.20.10.6", 1111);
socket.setSoTimeout(10000); // 10s timeout
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream());
dos.writeUTF("Please livestream"); dos.flush();
System.out.println("Đã g ư ‘i tới server Please livestream");
String response = dis.readUTF();
if (!"OK".equals(response)) {
System.out.println("Server response not OK or timeout exceeded. Exiting..."); socket.close(); return; }
System.out.println("Nhận được OK. Connected successfully. Starting livestream...");
JFrame frame = new JFrame("Client Video Stream");
VideoPanel videoPanel = new VideoPanel(); frame.add(videoPanel); frame.setSize(1500, 1200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); new Thread(() -> { try { while (true) { dos.writeUTF("Get Video"); dos.flush();
System.out.println("Gư‘ i cho server chuỗi ' Get Video");
int len = dis.readInt();
if (len <= 0) continue;
byte[] imageBytes = new byte[len]; dis.readFully(imageBytes);
ByteArrayInputStream bais = new
ByteArrayInputStream(imageBytes);
BufferedImage img = ImageIO.read(bais);
if (img != null) { videoPanel.updateImage(img); } }
} catch (SocketTimeoutException e) {
System.out.println("Connection timeout while receiving video.");
} catch (IOException e) {
System.out.println("Connection lost or error while receiving video."); } finally { try { socket.close();
} catch (IOException ex) { ex.printStackTrace(); } } }).start();
} catch (SocketTimeoutException e) {
System.out.println("Connection timeout. Exiting...");
} catch (IOException e) { e.printStackTrace(); } } }
class VideoPanel extends JPanel {
private BufferedImage img;
private int off = 10; @Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
g.drawImage(img, off, off, getWidth() - off, getHeight() - off,
0, 0, img.getWidth(), img.getHeight(), null); } }
public void updateImage(BufferedImage newImg) { this.img = newImg; repaint(); } }
Dán các kết quả thực thi vào bên dưới
(Chú ý phải hiển thị các thông điệp gifia client và server trong quá trình thực thi. Thực thi tất cả các
trường hợp có thể có!!)
• Trường hợp 1: Client đã nhận được chuỗi “OK” Phía server: Phía client: Hình ảnh livestream:
• Trường hợp 2: Client nằm trong blacklist Phía server: Phía client:
Câu 2 (1 đ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ì? Nêu ưu nhược điểm khi sfí dụng UDP, tại sao? (Không cần code, chỉ cần mô tả)
# Trả lời:
Các công việc cần làm khi chuyển chương trình ở câu 1 tfi TCP sang UDP:
- Thay Socket, ServerSocket, DataOutputStream, và DataInputStream bằng DatagramSocket và DatagramPacket
- Tạo một DatagramSocket lắng nghe tại một cổng cụ thể
- Sfí dụng DatagramPacket để nhận và gfíi dfi liệu
- Thay thế việc đọc/ghi dfi liệu qua DataInputStream và DataOutputStream bằng cách gfíi và nhận mảng
byte (byte[]) qua DatagramPacket Ưu điểm:
- UDP không có cơ chế kiểm soát luồng, xác nhận gói tin hoặc thiết lập kết nối. Điều này giúp giảm độ
trễ và tài nguyên cần thiết khi truyền dfi liệu
- UDP không cần duy trì trạng thái kết nối hoặc thông tin trạng thái, giảm bớt độ phfíc tạp trong việc triển khai
- Gfíi dfi liệu liên tục Nhược điểm:
- Không đảm bảo độ tin cậy so với TCP
- Không có kiểm soát lỗi tích hợp
- Trường hợp các gói tin đến sai thfí tự, UDP không cung cấp cơ chế tự sắp xếp lại
Câu 3 (5 điểm): Các nhóm triển khai phần project bằng Jsp-Servlet theo mô hình MVC đã nộp.
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 và công việc của từng thành viên trong nhóm đã triển khai:
# Trả lời: viết câu trả lời vào bên dưới Họ tên Nhiệm vụ Võ Đình Hải
- Lập trình các chức năng cho trang chủ, thực đơn, giỏ hàng,
thanh toán, quản lí tài khoản, đơn hàng của Người dùng.
- Lập trình chức năng quản lí tài khoản cho Người quản lý.
- Thiết kế Cơ sở dữ liệu. Trần Vũ Lâm
- Lập trình các chức năng đăng nhập, đăng ký, quên mật khẩu,
phân quyền sử dụng hệ thống.
- Lập trình chức năng quản lý sản phẩm, quản lý đơn hàng cho Người quản lý.
- Thiết kế Cơ sở dữ liệu.
Nguyễn Lê Quốc Huy - Lập trình giao diện cho hệ thống
- Lập trình chức năng quản lý đơn hàng, quản lý khuyến mãi cho Người quản lý.
- Thiết kế Cơ sở dữ liệu.
b) Mô tả các chfíc năng chính của chương trình và những chức năng 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 -
Các chức năng chính: Xem thực đơn, thêm món ăn vào giỏ hàng, thực hiện thanh toán ( bằng
phương thức COD, VNPAY), đăng nhập, đăng ký, Quản lí món ăn( thêm, sửa, xoá, tìm kiếm),
quản lí tài khoản, quản lí khuyến mãi(thêm, sửa, xoá, tìm kiếm), quản lý đơn hàng ( thêm, sửa,
xoá, tìm kiếm), thực hiện quên mật khẩu và lấy lại tài khoản qua gmail -
Các chức năng bản thân đã đóng góp: Các chức năng hiển thị món ăn lên trang chủ, thực đơn,
thêm món ăn vào giỏ hàng, quản lí giỏ hàng, thực hiện thanh toán bằng COD, VNPAY, chức
năng quản lí tài khoản, đơn hàng.
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 17 tháng 12 năm 2024