Thông tin thí nghiệm
Mã sinh viên: 20242321
Lớp: 2423
Tên sinh viên: Trần Ngọc Khánh
Giáo viên: Nguyễn Đức Hùng
Ngày thực hiện: 16 tháng 4 năm 2025
Nội dung thí nghiệm
- Tạo và sử dụng Cổng Socket (TCP/UDP) để thực hiện giao tiếp giữa Server và Client
- Thực hiện truyền file thông qua thao tác đọc và ghi file
- Thực hiện mã hóa và giải mã nội dung truyền
- Yêu cầu thực hiện thí nghiệm trong cùng một mạng LAN
- Code được lưu trữ trên Gitee:
Server.py: https://gitee.com/username/repository
Client.py: https://gitee.com/username/repository
Quá trình và kết quả thí nghiệm
1. Tạo và sử dụng Cổng Socket để truyền thông cơ bản
- Import thư viện Socket và tạo cổng Socket cho cả Server và Client
- Kiểm tra địa chỉ IP của các máy trong cùng một mạng LAN
- Điền địa chỉ IP và cổng cho Server
- Chạy Server trước, sau đó chạy Client
Mã nguồn Server:
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('192.168.1.100', 8888))
server_socket.listen(5)
print("Đang nghe...")
client_socket, client_address = server_socket.accept()
print(f"Kết nối từ {client_address}")
while True:
data = client_socket.recv(1024)
if not data:
break
print(f"Người dùng gửi: {data.decode('utf-8')}")
response = input("Phản hồi từ Server: ")
client_socket.send(response.encode('utf-8'))
client_socket.close()
server_socket.close()
Mã nguồn Client:
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('192.168.1.100', 8888))
try:
while True:
message = input("Nhập tin nhắn từ Client: ")
client_socket.send(message.encode('utf-8'))
data = client_socket.recv(1024)
print(f"Server gửi lại: {data.decode('utf-8')}")
finally:
client_socket.close()
2. Truyền file với mã hóa Fernet
- Thư viện mã hóa sử dụng: cryptography
- Loại mã hóa: Fernet (mã hóa đối xứng)
- Thực hiện:
- Tạo file khóa (key) và file nguồn cần truyền
- Server đọc khóa và chờ kết nối
- Client đọc file nguồn, mã hóa và gửi đến Server
- Server接收 và giải mã file nhận được
Mã nguồn Server:
from cryptography.fernet import Fernet
import socket
def load_key():
try:
with open("encryption.key", "rb") as key_file:
return key_file.read()
except FileNotFoundError:
print("Không tìm thấy file khóa!")
return None
def start_server():
key = load_key()
if key is None:
return
cipher = Fernet(key)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('192.168.1.100', 9000))
server_socket.listen(1)
print("Server đã啟 động và đang chờ kết nối...")
conn, addr = server_socket.accept()
print(f"Đã kết nối từ {addr}")
encrypted_data = conn.recv(1024)
decrypted_data = cipher.decrypt(encrypted_data)
with open("received_file.txt", "wb") as file:
file.write(decrypted_data)
print("File đã接收 và giải mã thành công.")
conn.close()
server_socket.close()
start_server()
Mã nguồn Client:
from cryptography.fernet import Fernet
import socket
def load_key():
try:
with open("encryption.key", "rb") as key_file:
return key_file.read()
except FileNotFoundError:
print("Không tìm thấy file khóa!")
return None
def send_encrypted_file(filename):
key = load_key()
if key is None:
return
cipher = Fernet(key)
with open(filename, 'rb') as file:
data = file.read()
encrypted_data = cipher.encrypt(data)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('192.168.1.100', 9000))
client_socket.send(encrypted_data)
print("File đã được mã hóa và gửi thành công.")
client_socket.close()
while True:
choice = input("Bạn có muốn gửi file? (Y/n): ")
if choice.lower() == 'y':
filename = input("Nhập tên file cần gửi: ")
send_encrypted_file(filename)
elif choice.lower() == 'n':
print("Kết thúc quá trình gửi file.\nCảm ơn đã sử dụng.")
break
else:
print("Nhập không hợp lệ. Vui lòng nhập Y hoặc n.")
Các vấn đề gặp phải và cách giải quyết
- Vấn đề 1: Không biết cách thực hiện thao tác đọc/ghi file trong Python
- Giải pháp: Tham khảo tài liệu trên CSDN về các thao tác cơ bản với file trong Python
- Vấn đề 2: Địa chỉ IP không đúng khi chạy Client
- Giải pháp: Đổi địa chỉ IP của Client sang địa chỉ IP của Server và chạy lại
Những suy nghĩ sau thí nghiệm
- Đã gặp một số lỗi liên quan đến thư viện mã hóa nhưng đã giải quyết được
- Hiểu rõ hơn về cách sử dụng Socket và các thao tác file trong môi trường mạng LAN