Python Socket Programmeren – Voorbeeld van Server, Client

Goedendag leerlingen! In onze vorige tutorial bespraken we de Python unittest-module. Vandaag zullen we een voorbeeld bekijken van Python socket programming. We zullen Python socket server- en clienttoepassingen maken.

Python Socket Programming

Om Python socket programming te begrijpen, moeten we meer weten over drie interessante onderwerpen – Socket Server, Socket Client en Socket. Dus, wat is een server? Welnu, een server is software die wacht op clientverzoeken en deze dienovereenkomstig bedient of verwerkt. Aan de andere kant is een client de aanvrager van deze service. Een clientprogramma vraagt om bepaalde bronnen bij de server en de server reageert op dat verzoek. Een socket is het eindpunt van een bidirectioneel communicatiekanaal tussen server en client. Sockets kunnen communiceren binnen een proces, tussen processen op dezelfde machine of tussen processen op verschillende machines. Voor elke communicatie met een extern programma moeten we via een socketpoort verbinden. Het hoofddoel van deze socket programming tutorial is om je kennis te laten maken met hoe een socketserver en -client met elkaar communiceren. Je leert ook hoe je een Python socket serverprogramma schrijft.

Voorbeeld van Python Socket

We hebben eerder gezegd dat een socketclient om bepaalde bronnen vraagt aan de socketserver en dat de server reageert op dat verzoek. Dus zullen we zowel het server- als het clientmodel ontwerpen zodat elk met hen kan communiceren. De stappen kunnen als volgt worden beschouwd.

  1. Het Python-socketserverprogramma wordt eerst uitgevoerd en wacht op elk verzoek.
  2. Het Python-socketclientprogramma zal het gesprek als eerste initiëren.
  3. Vervolgens zal het serverprogramma dienovereenkomstig reageren op clientverzoeken.
  4. Het clientprogramma zal worden beëindigd als de gebruiker het bericht “bye” invoert. Het serverprogramma zal ook worden beëindigd wanneer het clientprogramma wordt beëindigd, dit is optioneel en we kunnen het serverprogramma onbepaald laten draaien of beëindigen met een specifieke opdracht in het clientverzoek.

Python Socket Server

We zullen het Python-socketserverprogramma opslaan als socket_server.py. Om Python-socketverbinding te gebruiken, moeten we de socket-module importeren. Vervolgens moeten we sequentieel enkele taken uitvoeren om een verbinding tussen server en client tot stand te brengen. We kunnen het hostadres verkrijgen met behulp van de socket.gethostname()-functie. Het wordt aanbevolen om een poortadres boven 1024 te gebruiken, omdat poortnummers kleiner dan 1024 zijn gereserveerd voor standaard internetprotocollen. Zie hieronder een voorbeeldcode van een Python-socketserver, de opmerkingen zullen je helpen de code te begrijpen.

import socket


def server_program():
    # verkrijg de hostnaam
    host = socket.gethostname()
    port = 5000  # initiate port no above 1024

    server_socket = socket.socket()  # get instance
    # let goed op. De bind()-functie neemt een tuple als argument
    server_socket.bind((host, port))  # bind host address and port together

    # configureer hoeveel clients de server gelijktijdig kan beluisteren
    server_socket.listen(2)
    conn, address = server_socket.accept()  # accept new connection
    print("Connection from: " + str(address))
    while True:
        # ontvang gegevensstroom. Het accepteert geen datapakket groter dan 1024 bytes
        data = conn.recv(1024).decode()
        if not data:
            # als er geen gegevens worden ontvangen, breek dan
            break
        print("from connected user: " + str(data))
        data = input(' -> ')
        conn.send(data.encode())  # send data to the client

    conn.close()  # close the connection


if __name__ == '__main__':
    server_program()

Dus onze Python-socketserver draait op poort 5000 en wacht op clientverzoeken. Als je wilt dat de server niet stopt wanneer de verbinding met de client is verbroken, verwijder dan de if-voorwaarde en de break-verklaring. De Python while-lus wordt gebruikt om het serverprogramma onbepaald uit te voeren en te wachten op clientverzoeken.

Python Socket Client

We zullen het Python-socketclientprogramma opslaan als socket_client.py. Dit programma lijkt op het serverprogramma, behalve het binden. Het belangrijkste verschil tussen het server- en clientprogramma is dat het serverprogramma het hostadres en het poortadres samen moet binden. Zie het onderstaande voorbeeld van een Python-socketclientprogramma, het commentaar zal je helpen om de code te begrijpen.

import socket


def client_program():
    host = socket.gethostname()  # as both code is running on same pc
    port = 5000  # socket server port number

    client_socket = socket.socket()  # instantiate
    client_socket.connect((host, port))  # connect to the server

    message = input(" -> ")  # take input

    while message.lower().strip() != 'bye':
        client_socket.send(message.encode())  # send message
        data = client_socket.recv(1024).decode()  # receive response

        print('Received from server: ' + data)  # show in terminal

        message = input(" -> ")  # again take input

    client_socket.close()  # close the connection


if __name__ == '__main__':
    client_program()

Uitvoer van Python Socket Programmeren

Om de uitvoer te zien, voer eerst het socket-serverprogramma uit. Voer vervolgens het socket-clientprogramma uit. Schrijf daarna iets vanuit het clientprogramma. Schrijf dan opnieuw een antwoord vanuit het serverprogramma. Schrijf ten slotte bye vanuit het clientprogramma om beide programma’s te beëindigen. Hieronder zie je een korte video die laat zien hoe het werkte bij mijn testrun van de voorbeeldprogramma’s voor socketserver en -client.

pankaj$ python3.6 socket_server.py 
Connection from: ('127.0.0.1', 57822)
from connected user: Hi
 -> Hello
from connected user: How are you?
 -> Good
from connected user: Awesome!
 -> Ok then, bye!
pankaj$
pankaj$ python3.6 socket_client.py 
 -> Hi
Received from server: Hello
 -> How are you?
Received from server: Good
 -> Awesome!
Received from server: Ok then, bye!
 -> Bye
pankaj$

Let op dat de socketserver draait op poort 5000, maar de client heeft ook een socketpoort nodig om verbinding te maken met de server. Deze poort wordt willekeurig toegewezen door de clientconnectieaanroep. In dit geval is het 57822. Dus, dat is alles voor Python-socketprogrammering, voorbeeldprogramma’s voor Python-socketserver en -client. Referentie: Officiële Documentatie

Source:
https://www.digitalocean.com/community/tutorials/python-socket-programming-server-client