Topic: Problema Client e Server socket TCP [Risolto]  (Letto 1493 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline coppolino

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
    • Federico Coppola
Problema Client e Server socket TCP [Risolto]
« il: Luglio 21, 2016, 20:41 »
Salve a tutti,
ho provato a sviluppare un semplice programma server socket tcp e un semplice programma client socket tcp.
Il problema è che quando invio un messaggio con il programma client scritto in python il server riceve la connessione da parte del client ma al momento di dover visualizzare il messaggio che gli è stato inviato, inizia a stampare all'infinito b''  :question:
Il programma del server socket funziona correttamente utilizzando come client Arduino con una shield WI-FI..quindi non credo che l'errore sia nel server, tuttavia nel client non capisco nemmeno dove possa essere l'errore.. :confused:

Ecco i due programmi

Server
[codice]
#Server TCP semplice

import socket #modulo per la gestione del socket tcp/udp
import time


print("Server TCP semplice!");
print("Avvio in corso...")


# ottengo hostname e indirizzo IP
hostname = socket.gethostname()
IP = socket.gethostbyname(hostname)
#imposto porta sulla quale resto in ascolto
porta = 5000

try:
    #creazione del socket indicato tipologia IP (versione 4) e protocollo (TCP)
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #ip e porta sulla quale resti in ascolto il server
    server.bind((IP,porta))
    # numero di connessioni max
    server.listen(1)
    
    print("Stato server: OK")

except:
    print("Stato server: Errore!")
    time.sleep(5)
    exit(1)


client,ip_client=server.accept()
print("Richiesta ip: ",ip_client)
while True:
    richiesta = client.recv(1024)

    if richiesta is "":
        print("chiusura socket tcp con client: ",ip_client)
        client.close() #chiusura socket
        break
    else:
        print(richiesta)
        richiesta = "" #pulisco variabile richiesta

print("Chiusura programma in corso...")
exit(1)
[/codice]

Client
[codice]# Client TCP semplice

import socket

host_remoto=""
porta = 5000


print("Semplice client")

while True:
    host_remoto = input("Digitare ip server remoto: ")

    try:
        client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        client.connect((host_remoto,porta))
        print("Connessione riuscita!")
        break
    except:
        print("Errore connessione server remoto...riprovare!")


saluto = "ciao server"
saluto_byte = bytes(saluto,"utf-8")

client.send(saluto_byte)
print("Messaggio inviato al server...")

client.close()
[/codice]
Grazie in anticipo se qualcuno potrà essermi di aiuto!  :py: ;)
« Ultima modifica: Luglio 27, 2016, 19:54 da coppolino »

Offline Markon

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 4.104
  • Punti reputazione: 5
    • Mostra profilo
    • Neolithic
Re: Problema Client e Server socket TCP
« Risposta #1 il: Luglio 22, 2016, 11:24 »
Ciao.

Se noti bene, l'output e' diverso:

[codice]$ python3 server.py
Server TCP semplice!
Avvio in corso...
Stato server: OK
Richiesta ip:  ('127.0.0.1', 50362)
b'ciao server'
b''
b''
b''
b''
...[/codice]

Innanzitutto, il fatto che venga stampato un messaggio all'infinito nel 99% dei casi significa che si e' incastrati in un loop.
Quanti loop hai nel tuo server? 1 solo. Quante print hai nel tuo loop? 2. Il messaggio "chiusura socket tcp con client" viene stampato? No. Questo non significa nient'altro che richiesta is "" e' False!

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.659
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re: Problema Client e Server socket TCP
« Risposta #2 il: Luglio 22, 2016, 11:37 »
Le vere domande sono:

- perché ti aspetti che richiesta sia ""?
- sai la differenza tra b'' e ''?
- perché controlli PROPRIO che richiesta sia ''?
- perché pulisci richiesta se poi la risetti alla prossima iterazione?

Offline coppolino

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
    • Federico Coppola
Re: Problema Client e Server socket TCP
« Risposta #3 il: Luglio 23, 2016, 14:16 »
Citazione
Questo non significa nient'altro che richiesta is "" e' False!

Sono un neofita di questo linguaggio di programmazione, ma da quanto ho letto si può effettuare il confronto fra stringhe semplicemente comparandole, senza dover andare a richiamare metodi o funzioni dedicate come ad esempio in C "strcmp" oppure in C# "String.Compare" ...
Il problema allora penso che sia dovuto al fatto che confronto una stringa con dei bytes..

Tuttavia ho provato a fare questo esperimento su Python Shell ma non riesco a capire dove sia l'errore, per quanto riguarda la conversione bytes to string :

[codice]
>>> a = "mondo"
>>> b = bytes(a,"utf-8")
>>> print(b)
b'mondo'
>>> type(a)
<class 'str'>
>>> type(b)
<class 'bytes'>
>>> a is b
False
>>> c = b.decode("utf-8")
>>> type (c)
<class 'str'>
>>> a is c
False
>>> print (c)
mondo
>>> print(b)
b'mondo'
>>> print(a)
mondo
[/codice]

Non capisco perchè a e c non sono uguali...

Citazione
perché ti aspetti che richiesta sia ""?
Mi aspettavo "" perchè ho ragionato subito in termini di stringa..
Citazione
sai la differenza tra b'' e '
b"" indica bytes mentre "" una stringa
Citazione
perché pulisci richiesta se poi la risetti alla prossima iterazione?
La pulizia l'ho inserita per sicurezza...o così ho pensato!

Grazie per l'aiuto!  :hug-left:



Offline Markon

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 4.104
  • Punti reputazione: 5
    • Mostra profilo
    • Neolithic
Re: Problema Client e Server socket TCP
« Risposta #4 il: Luglio 24, 2016, 23:25 »
L'operatore is verifica che due oggetti abbiano stesso indirizzo, non valore, per cui non funzionerà perché non sono due stringhe che puntano allo stesso indirizzo.
« Ultima modifica: Luglio 26, 2016, 15:56 da Markon »

Offline coppolino

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
    • Federico Coppola
Re: Problema Client e Server socket TCP
« Risposta #5 il: Luglio 26, 2016, 11:53 »
Penso di aver capito i vari errori..

Ho seguito delle videolezioni su YouTube e avevo capito che "is" e "==" avessero la stessa funzione   :thinking:

provo a correggere il programma del server TCP!  :)

Grazie  ;)

Offline coppolino

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
    • Federico Coppola
Re: Problema Client e Server socket TCP
« Risposta #6 il: Luglio 27, 2016, 19:53 »
Grazie per i consigli!
Sono riuscito ad eseguire il programma proprio come volevo!
Ciao  ;)

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re: Problema Client e Server socket TCP
« Risposta #7 il: Agosto 17, 2016, 12:20 »
Ho seguito delle videolezioni su YouTube e avevo capito che "is" e "==" avessero la stessa funzione   :thinking:

Se per caso ti ritrovi a passare da queste parti, sono curioso di sapere le videolezioni di chi...  :angel: