לדלג לתוכן

2.1 סוקטים פתרון

שרת echo

  • שרת
    import socket
    
    # שרת echo
    def start_echo_server(host, port):
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server_socket.bind((host, port))
        server_socket.listen(5)
        print(f"Listening on {host}:{port}...")
    
        while True:
            client_socket, client_address = server_socket.accept()
            print(f"Connection from {client_address}")
            data = client_socket.recv(1024)
            while data:
                client_socket.send(data)
                data = client_socket.recv(1024)
            client_socket.close()
    
    if __name__ == "__main__":
        start_echo_server("127.0.0.1", 65432)
    
  • לקוח
    def start_echo_client(host, port):
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client_socket.connect((host, port))
        while True:
            message = input("Enter message: ")
            client_socket.send(message.encode())
            data = client_socket.recv(1024)
            print(f"Received: {data.decode()}")
    
    if __name__ == "__main__":
        start_echo_client("127.0.0.1", 65432)
    

שרת מייל

  • שרת
    import socket
    
    clients = {}
    
    # שרת מיילים
    def start_mail_server(host, port):
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server_socket.bind((host, port))
        server_socket.listen(5)
        print(f"Mail server started on {host}:{port}...")
    
        while True:
            client_socket, client_address = server_socket.accept()
            print(f"Connection from {client_address}")
            client_socket.send(b"Enter your name: ")
            name = client_socket.recv(1024).decode().strip()
            clients[client_socket] = {'name': name, 'inbox': []}
            client_socket.send(b"Welcome, " + name.encode() + b"\n")
    
            while True:
                client_socket.send(b"1. Send mail\n2. Read inbox\n3. Exit\n")
                option = client_socket.recv(1024).decode().strip()
                if option == "1":
                    client_socket.send(b"Enter recipient name: ")
                    recipient_name = client_socket.recv(1024).decode().strip()
                    recipient_socket = next((s for s, v in clients.items() if v['name'] == recipient_name), None)
                    if recipient_socket:
                        client_socket.send(b"Enter your message: ")
                        message = client_socket.recv(1024).decode().strip()
                        recipient_socket.send(f"New mail from {clients[client_socket]['name']}: {message}".encode())
                    else:
                        client_socket.send(b"Recipient not found.\n")
                elif option == "2":
                    inbox = "\n".join(clients[client_socket]['inbox']) or "No mail."
                    client_socket.send(f"Your inbox:\n{inbox}\n".encode())
                elif option == "3":
                    client_socket.close()
                    break
    
    if __name__ == "__main__":
        start_mail_server("127.0.0.1", 65433)
    
  • לקוח
    def start_mail_client(host, port):
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client_socket.connect((host, port))
        while True:
            message = client_socket.recv(1024).decode()
            print(message)
            if message.startswith("Enter your name"):
                name = input()
                client_socket.send(name.encode())
            elif message.startswith("1. Send mail"):
                option = input()
                client_socket.send(option.encode())
                if option == "1":
                    message = client_socket.recv(1024).decode()
                    print(message)
                    recipient = input()
                    client_socket.send(recipient.encode())
                    message = client_socket.recv(1024).decode()
                    print(message)
                    message_body = input()
                    client_socket.send(message_body.encode())
                elif option == "2":
                    message = client_socket.recv(1024).decode()
                    print(message)
                elif option == "3":
                    break
    
    if __name__ == "__main__":
        start_mail_client("127.0.0.1", 65433)
    

ווצ'אפ

  • שרת -שימו לב שבפתרון משומש ספריית threading כדי לגרום לhandle client לרוץ ברקע, אם אתם לא מכירים את הנושא מוזמנים לקרוא באינטרנט או לעשות את הקורס פייתון שלנו: "קורס תכנות בסיסי".
    import socket
    import threading
    
    clients = {}
    
    def handle_client(client_socket, client_address):
        client_socket.send(b"Enter your name: ")
        name = client_socket.recv(1024).decode().strip()
        clients[client_socket] = name
        client_socket.send(b"Welcome to the chat!\n")
    
        while True:
            message = client_socket.recv(1024)
            if message:
                for socket, client_name in clients.items():
                    if socket != client_socket:
                        socket.send(f"{name}: {message.decode()}\n".encode())
            else:
                break
        del clients[client_socket]
        client_socket.close()
    
    def start_chat_server(host, port):
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server_socket.bind((host, port))
        server_socket.listen(5)
        print(f"Chat server started on {host}:{port}...")
    
        while True:
            client_socket, client_address = server_socket.accept()
            print(f"New connection from {client_address}")
            thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
            thread.start()
    
    if __name__ == "__main__":
        start_chat_server("127.0.0.1", 65434)
    
  • לקוח
    import socket
    import threading
    
    def receive_messages(client_socket):
        while True:
            message = client_socket.recv(1024)
            if message:
                print(message.decode(), end="")
            else:
                break
    
    def start_chat_client(host, port):
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client_socket.connect((host, port))
    
        name = input("Enter your name: ")
        client_socket.send(name.encode())
    
        thread = threading.Thread(target=receive_messages, args=(client_socket,))
        thread.start()
    
        while True:
            message = input()
            if message:
                client_socket.send(message.encode())
            else:
                break
        client_socket.close()
    
    if __name__ == "__main__":
        start_chat_client("127.0.0.1", 65434)