رفتن به محتوای اصلی
برنامه‌سازی پیشرفته با پایتون درس‌نامهٔ آزاد
مثال پیشرفته ۱۵ دقیقه

پروتکل اکوی کوچک با سوکت

سرور اکویی بساز که پیام فارسی را بگیرد و با پیشوند echo برگرداند؛ مرز پیام را هم حل کن.

صورت مسئله

سرور اکویی بساز که پیام فارسی را بگیرد و با پیشوند echo برگرداند؛ مرز پیام را هم حل کن.

مثال حل‌شده

اکوی طول‌اول

پیشرفته

صورت مسئله

چرا فرستادنِ خام کافی نیست و ۴ بایت طول اولِ پیام چه مشکلی را حل می‌کند؟

راه‌حل گام‌به‌گام

    ۴ گام باقی مانده
    import socket, struct
    
    def send_message(sock, text):
        data = text.encode("utf-8")
        sock.sendall(struct.pack(">I", len(data)) + data)
    
    def recv_exact(sock, n):
        buf = b""
        while len(buf) < n:
            chunk = sock.recv(n - len(buf))
            if not chunk:
                raise ConnectionError("اتصال وسط پیام قطع شد.")
            buf += chunk
        return buf
    
    def recv_message(sock):
        (length,) = struct.unpack(">I", recv_exact(sock, 4))
        return recv_exact(sock, length).decode("utf-8")
    
    # سرور (در یک ترمینال)
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind(("127.0.0.1", 65432))
        s.listen(1)
        conn, addr = s.accept()
        with conn:
            msg = recv_message(conn)
            send_message(conn, "echo:" + msg)
    
    # کلاینت (در ترمینال دیگر)
    with socket.create_connection(("127.0.0.1", 65432), timeout=5) as s:
        send_message(s, "سلام سرور")
        print(recv_message(s))  # echo:سلام سرور

    مطالب مرتبط

    از همین بخش و با برچسب‌های مشترک

    این مطلب را خواندید؟ آن را علامت بزنید تا پیشرفت شما روی همین دستگاه ذخیره شود.

    وضعیت پیشرفت برای پروتکل اکوی کوچک با سوکت