ĐỀ THI BÀI M - Đề 2
Tên học phần: Lập Trình Mạng
học phần: Hình thfíc thi: Tự luận giám sát
Thời gian làm bài: 60 phút (không kể thời gian phát đề nộp 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: Đình Hải Lớp: 22T_DT4 MSSV:102220186
Sinh viên làm i trực tiếp trên tệp y, lưu tệp với định dạng MSSV_HọTên.pdf 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 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.
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 đó phải :
a. Nếu Please livestream thì phản hồi cho client chuỗi “OK”.
b. Nếu 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 nhiều client kết nối ti.
2. Nếu client ngắt kết nối đột ngột cần xử loại bỏ kết nối để không phải lưu trữ thông tin client đó.
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA Công Nghệ Thông Tin
BỘ MÔN: MẠNG & TT
# Trả lời:
Dán code server vào bên ớ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<String, ClientHandler> 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;
}
}
+ clientIP);
if (isBlacklisted) {
System.out.println("Rejected connection from blacklisted IP: "
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("Nhn đưc: " + request );
dos.writeUTF("OK");
System.out.println("Gưi li: 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();
Byte");
dos.writeInt(imageBytes.length);
dos.write(imageBytes);
System.out.println("Đã i chiu`
dos.flush();
}
}
}
dài m ang Byte + mang
} 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 ớ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("Đã i ti 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("Nhn đư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 chui'
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);
Get Video");
}
}
video.");
video.");
} catch (SocketTimeoutException e) {
System.out.println("Connection timeout while receiving
} catch (IOException e) {
System.out.println("Connection lost or error while receiving
} 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, DataInputStream bằng DatagramSocket và
DatagramPacket
Câu 3 (5 điểm): Các nhóm triển khai phần project bằng Jsp-Servlet theo 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 ới
Họ tên
Nhiệm 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 tài khoản cho Người quản lý.
- Thiết kế sở dữ liệu.
Trần 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 sản phẩm, quản đơn hàng cho
Người quản lý.
- Thiết kế sở dữ liệu.
Nguyễn 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 khuyến mãi
cho Người quản lý.
- Thiết kế sở dữ liệu.
b) tả các chfíc ng chính của chương trình và những chức năng bản thân đã đóng góp vào trong
chương trình.
- 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 nhận mảng
byte (byte[]) qua DatagramPacket
Ưu điểm:
- UDP không 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 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 chế tự sắp xếp lại
# Trả lời: viết câu trả lời vào bên ớ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 món ăn( thêm, sửa, xoá, tìm kiếm),
c) Hãy tả cách thức để thể xử một request với thời gian lớn 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)
Đà Nẵng, ngày 17 tháng 12 năm 2024
quản tài khoản, quản khuyến mãi(thêm, sửa, xoá, tìm kiếm), quản đơ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.
# Trả lời: viết câu trả lời vào bên dưới

Preview text:

TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA Công Nghệ Thông Tin BỘ MÔN: MẠNG & TT
ĐỀ THI 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 giám sát
Thời gian làm bài: 60 phút (không kể thời gian phát đề 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: Đì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 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ử 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 tả cách thức để thể xử một request với thời gian lớn 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