Báo cáo thí nghiệm 3 - Thiết kế chương trình Python năm 2024-2025

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

  1. Tạo và sử dụng Cổng Socket (TCP/UDP) để thực hiện giao tiếp giữa Server và Client
  2. Thực hiện truyền file thông qua thao tác đọc và ghi file
  3. Thực hiện mã hóa và giải mã nội dung truyền
  4. Yêu cầu thực hiện thí nghiệm trong cùng một mạng LAN
  5. 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:
  1. Tạo file khóa (key) và file nguồn cần truyền
  2. Server đọc khóa và chờ kết nối
  3. Client đọc file nguồn, mã hóa và gửi đến Server
  4. 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

Thẻ: python socket Network Programming File Handling cryptography

Đăng vào ngày 26 tháng 5 lúc 14:16