Python: sockets sluiten

Moderators: jkien, Xilvo

Reageer
Gebruikersavatar
Berichten: 2.351

Python: sockets sluiten

Ik ben een gedistribueerde applicatie aan het maken waarbij een laptop gekoppeld aan een electrolyser stroom en spanning doorstuurt naar een tweede laptop. De applicaties op beide laptops zijn geschreven in python. De stroom in de electrolyser wordt gemeten via een arduino. Er loopt echter af en toe wat mis met het doorsturen van de stroom en de spanning tussen de laptops.

Dit is een deel van de code op de laptop die spanning en stroom binnenkrijgt.

Code: Selecteer alles

def server_program():
    global vermogen, spanning, stroom, rpm
    host = socket.gethostname()
    port = 1001
    server_socket = socket.socket()
    server_socket.bind((host, port))
    print("server gestart: " + str(host))
    server_socket.listen(2)
    while True:
        conn, address = server_socket.accept()
        print("verbonden apparaat: " + str(address))
        data = conn.recv(1024).decode()
        if data:
            try:
                spanning = int(data.split(';')[0].split(':')[1])
                stroom = int(data.split(';')[1].split(':')[1])
                rpm= int(data.split(';')[2].split(':')[1])
                vermogen=np.multiply(spanning,stroom)
                print("van verbonden gebruiker: " + str(data))
                update_queues()
            except Exception as e:
                print("Foutief bericht ontvangen:", data)
        conn.close()
Deze laptop krijgt berichten binnen van de andere laptop genre "I:4;U:5;RPM:45" die dan geïnterpreteerd worden. De communicatie blijft in principe eeuwig duren. Om de seconde wordt een update doorgestuurd.

Mijn vraag is nu, hoe ga je om met het sluiten van de connectie, die conn.close() dus. Is het goed om te werken met een conn.close() of laat je dat achterwege en blijf je werken met dezelfde connectie. Bedoeling is natuurlijk ook dat er niet te veel vertraging is, maar vooral dat het allemaal zo stabiel mogelijk is.

Gebruikersavatar
Berichten: 2.351

Re: Python: sockets sluiten

Waarschijnlijk opgelost. Vermoedelijk is hete beter om na elke keer dat een verbinding geaccepteerd wordt een nieuwe thread op te starten.

Code: Selecteer alles

def server_laptopbuiten_program():
    # Get the hostname
    host = socket.gethostname()
    port = 8090  # Initieer poortnummer boven 1024

    server_socket = socket.socket()  # Maak een instantie van de socket
    server_socket.bind((host, port))  # Koppel het hostadres en de poort samen

    print("server gestart: " + str(host))

    # Configureer hoeveel clients de server tegelijkertijd kan accepteren
    server_socket.listen()

    # a forever loop until client wants to exit
    while True:
        # establish connection with client
        c, addr = server_socket.accept()

        # lock acquired by client
        print_lock.acquire()
        print('Connected to :', addr[0], ':', addr[1])

        # Start a new thread and return its identifier
        start_new_thread(threaded_ontvanger, (c,))
    s.close()

Technicus
Berichten: 1.167

Re: Python: sockets sluiten

In python gebruik je voor connecties (zowel netwerk als files) meestal “with” statements.
Deze garanderen dat de connectie ook wordt gesloten als je code crasht (of een exception geeft) na de .open() maar voordat je bij .close() bent.

Het alternatief is om de hele communicatie in een try except te hangen, en in de except een .close() te zetten, maar dat levert dan weer issues op als de connectie om wat voor reden dan ook al geclosed was.

Gebruikersavatar
Berichten: 2.351

Re: Python: sockets sluiten

Ok, zoiets dan

Code: Selecteer alles

while True:
   conn, addr = s.accept()
   with conn:
       print('Connected by', addr)
       [...]

Gebruikersavatar
Moderator
Berichten: 4.097

Re: Python: sockets sluiten

En dan ook nog een with statement voor de socket creatie. Hier in de docs staat een voorbeeld.

Code: Selecteer alles

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data: break
            conn.sendall(data)

Code: Selecteer alles

# Echo client program
import socket

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)
print('Received', repr(data))

Reageer