Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Python - Server/Client Multi Thread [Errore Broken pipe]
Forum - Python - Server/Client Multi Thread [Errore Broken pipe]

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
macco_cl (Normal User)
Rookie


Messaggi: 34
Iscritto: 27/02/2007

Segnala al moderatore
Postato alle 13:05
Giovedì, 14/07/2016
Ciao a tutti, da poco ho iniziato a lavorare sulla programmazione Multi Thread perché ne ho necessità per un progetto che sto sviluppando, per adesso sto ancora cercando di imparare le basi della programmazione legate a questo argomento per poi cercare di applicarle al mio progetto.

Attualmente sto lavorando sui seguenti Script che ho trovato in rete e leggermente modificato.
Quello che vorrei è un Serve sempre in ascolto che possa stampare le informazioni che gli vengono inviate da N client (in questo momento 2) solo che il programma funziona perfettamente con un solo client, nel momento in cui lancio un secondo client, per un attimo i due client funzionano bene poi il primo client va in crash con questo errore:

socket.error: [Errno 32] Broken pipe

Mi potreste dare chiarimenti sul perché ottengo questo errore e in che modo posso evitarlo?

Grazie mille per il vostro aiuto

Di seguito il codice:

Server Script:

Codice sorgente - presumibilmente Python

  1. import socket
  2. from threading import Thread
  3. import time
  4. from SocketServer import ThreadingMixIn
  5.  
  6.  
  7. # Multithreaded Python server : TCP Server Socket Thread Pool
  8. class ClientThread(Thread):
  9.     def __init__(self, ip, port):
  10.         Thread.__init__(self)
  11.         self.ip = ip
  12.         self.port = port
  13.         print "[+] New server socket thread started for " + ip + ":" + str(port)
  14.  
  15.     def run(self):
  16.         while True:
  17.             data = conn.recv(2048)
  18.  
  19.             if data:
  20.                 print "Server received data:", data
  21.             else:
  22.                 print "NO Data"
  23.  
  24.             #MESSAGE = raw_input("Multithreaded Python server : Enter Response from Server/Enter exit:")
  25.             #if MESSAGE == 'exit':
  26.                 #break
  27.             #conn.send(MESSAGE)  # echo
  28.  
  29.  
  30. # Multithreaded Python server : TCP Server Socket Program Stub
  31. TCP_IP = '0.0.0.0'
  32. TCP_PORT = 2004
  33. BUFFER_SIZE = 20  # Usually 1024, but we need quick response
  34.  
  35. tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  36. tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  37. tcpServer.bind((TCP_IP, TCP_PORT))
  38. threads = []
  39.  
  40. while True:
  41.     tcpServer.listen(4)
  42.     print "Multithreaded Python server : Waiting for connections from TCP clients..."
  43.     (conn, (ip, port)) = tcpServer.accept()
  44.     newthread = ClientThread(ip, port)
  45.     newthread.start()
  46.     threads.append(newthread)
  47.  
  48. for t in threads:
  49.     t.join()



Client Script (metto solo 1 client perché ovviamente il codice è lo stesso anche per l'altro)
Codice sorgente - presumibilmente Python

  1. # Python TCP Client A
  2. import socket
  3. import time
  4. host = socket.gethostname()
  5. port = 2004
  6. BUFFER_SIZE = 2000
  7. #MESSAGE = raw_input("tcpClientA: Enter message/ Enter exit:")
  8.  
  9. tcpClientA = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  10. tcpClientA.connect((host, port))
  11.  
  12. #while MESSAGE != 'exit':
  13. while True:
  14.     tcpClientA.send("Client 1")
  15.     time.sleep(2)
  16.     #data = tcpClientA.recv(BUFFER_SIZE)
  17.     #print " Client2 received data:", data
  18.     #MESSAGE = raw_input("tcpClientA: Enter message to continue/ Enter exit:")
  19. #tcpClientA.sent("exit")
  20. tcpClientA.close()



PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:36
Giovedì, 14/07/2016
Prova a spostare:

Codice sorgente - presumibilmente Plain Text

  1. tcpServer.listen(4)



Fuori dal while (mettilo prima).


Il mio blog: https://piero.dev
PM Quote
Avatar
macco_cl (Normal User)
Rookie


Messaggi: 34
Iscritto: 27/02/2007

Segnala al moderatore
Postato alle 10:50
Venerdì, 15/07/2016
Ti ringrazio per l'aiuto, ho provato a spostarlo solo che ora quando lancio il secondo client ottengo il seguente errore: socket.error: [Errno 41] Protocol wrong type for socket

Quello che mi è venuto in mente, ma è solo una mia supposizione, che ci potrebbe essere un problema nella gestione del canale nel senso che tutti e due i Client nello stesso istante cercano di mandare qualcosa nel canale e allora il sistema ne blocca uno dei due per evitare un deadlock.

Possibile o sono completamente fuori strada?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:18
Venerdì, 15/07/2016
Ah, ogni thread deve fare riferimento alla propria connessione, non puoi condividere conn per ogni thread.

Codice sorgente - presumibilmente Python

  1. import socket
  2. from threading import Thread
  3. import time
  4. from SocketServer import ThreadingMixIn
  5.  
  6.  
  7. # Multithreaded Python server : TCP Server Socket Thread Pool
  8. class ClientThread(Thread):
  9.     def __init__(self, ip, port, conn):
  10.         Thread.__init__(self)
  11.         self.ip = ip
  12.         self.port = port
  13.         self.conn = conn
  14.         print "[+] New server socket thread started for " + ip + ":" + str(port)
  15.  
  16.     def run(self):
  17.         while True:
  18.             data = conn.recv(2048)
  19.  
  20.             if data:
  21.                 print "Server received data:", data
  22.             else:
  23.                 print "NO Data"
  24.  
  25.             #MESSAGE = raw_input("Multithreaded Python server : Enter Response from Server/Enter exit:")
  26.             #if MESSAGE == 'exit':
  27.                 #break
  28.             #conn.send(MESSAGE)  # echo
  29.  
  30.  
  31. # Multithreaded Python server : TCP Server Socket Program Stub
  32. TCP_IP = '0.0.0.0'
  33. TCP_PORT = 2004
  34. BUFFER_SIZE = 20  # Usually 1024, but we need quick response
  35.  
  36. tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  37. tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  38. tcpServer.bind((TCP_IP, TCP_PORT))
  39. threads = []
  40. tcpServer.listen(4)
  41.  
  42. while True:
  43.     print "Multithreaded Python server : Waiting for connections from TCP clients..."
  44.     (conn, (ip, port)) = tcpServer.accept()
  45.     newthread = ClientThread(ip, port, conn)
  46.     newthread.start()
  47.     threads.append(newthread)
  48.  
  49. for t in threads:
  50.     t.join()



Il mio blog: https://piero.dev
PM Quote
Avatar
macco_cl (Normal User)
Rookie


Messaggi: 34
Iscritto: 27/02/2007

Segnala al moderatore
Postato alle 16:55
Venerdì, 15/07/2016
Con le correzioni che mi hai apportato il codice non mi da più errori ma ottengo un output che non mi spiego, nel senso che quando a lato server vado a stampare la variabile "data" all'interno non trovo solo la stringa "Client 1" o "Client 2" ma un elenco variabile di "Client 1" o "Client 2" come mai? La mia domanda non è legata soltanto al funzionamento del codice ma vuole essere una domanda per capire bene il funzionamento dei Thread, visto che ho iniziato a lavorarci da poco.

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 21:09
Venerdì, 15/07/2016
Un thread ti permette di cominciare un'esecuzione parallela di codice.

Testo quotato


                --- Thread 1 --- "Server received data:", data (dal Client 1)
              /
Server ---
              \
                --- Thread 2 --- "Server received data:", data (dal Client 2)



L'istruzione:

Codice sorgente - presumibilmente Python

  1. print "Server received data:", data



Viene eseguita in parallelo, quindi è normale che avrai un alternarsi di "Client 1" e "Client 2" (non necessariamente in ordine).

Cerca "Thread" su Wikipedia.

Ultima modifica effettuata da pierotofy il 15/07/2016 alle 21:11


Il mio blog: https://piero.dev
PM Quote
Avatar
macco_cl (Normal User)
Rookie


Messaggi: 34
Iscritto: 27/02/2007

Segnala al moderatore
Postato alle 11:15
Lunedì, 18/07/2016
Scusa ma mi sono espresso male, non volevo dire che le stringhe vengono stampate in modo alterno, il mio tipo di output è una cosa del genere:

Esempio di Output che ottengo lanciando solo il client 1:

Server received data: Client1 Client1 Client1 Client1 Client1 Client1 Client1 Client1 Client1 Client1

la lunghezza di questo output è variabile, non appena mando in esecuzione il secondo client ottengo la stessa cosa solo con la stringa Client2 e non mi compare nemmeno più alcun output del Client 1.

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 15:17
Lunedì, 18/07/2016
Ah, si, assicurati di fare riferimento alla giusta variabile "conn" nel client:

Codice sorgente - presumibilmente Python

  1. def run(self):
  2.         while True:
  3.             data = self.conn.recv(2048)



Altrimenti referenzi l'ultima "conn" accettata.


Il mio blog: https://piero.dev
PM Quote
Avatar
macco_cl (Normal User)
Rookie


Messaggi: 34
Iscritto: 27/02/2007

Segnala al moderatore
Postato alle 10:36
Martedì, 19/07/2016
ti ringrazio per la correzione, ora i due thread producono un output in modo alternato solo che continuo ad avere dentro la variabile data tante stringe e non solo una.

l'output che vorrei dovrebbe essere:

Server received data: Client1
Server received data: Client 2
Server received data: Client1
...

e invece ho questo tipo di output:

Server received data: Client 1 Client 1 Client 1 Client 1 Client 1 Client 1 Client 1 Client 1 Client 1 Client 1 Client 1 Client 1 Client 1 Client 1 Client 1 Client 1 Client 1 Client 1
Server received data: Client 2 Client 2 Client 2 Client 2 Client 2 Client 2 Client 2 Client 2 Client 2 Client 2

Come mai?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo