ecco cosa devo fare
Scrivi programmi Python che utilizzano il modulo socket. Scrivi un client e un server. Il client leggerà un numero intero e invierà quel numero intero al server. Il server verificherà se il numero intero è primo e restituisce True o False al client. Il server stamperà anche che ha ricevuto il numero intero e quale numero intero ha ricevuto. Il client segnalerà quindi (ad esempio) "I server dicono che 17 è primo" o "I server dicono che 18 non è un numero primo" Il client chiede quindi un altro numero intero da testare. Questo continua fino a quando l'utente immette 0.
ed ecco quello che ho finora
script del server
#!/usr/bin/python
import socket
tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpsocket.bind( ("0.0.0.0", 8000) )
tcpsocket.listen(2)
(client, (ip,port) ) = tcpsocket.accept()
value = int(client.recv(2048))
MESSAGE1 = "The number %s is not a prime number" %value
MESSAGE2 = "The number %s is a prime number" %value
print "received connection from %s" %ip
print " port is number %d" %port
print " number value received is number %d" %value
for i in range(2,value):
if (value % i) == 0:
client.send(MESSAGE1)
else:
client.send(MESSAGE2)
dalla parte del cliente
#!/usr/bin/python
import socket
import sys
tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
num = []
while num != 0 :
num = raw_input("Enter number: ")
tcpsocket.connect( ("192.168.233.132", 8000) )
tcpsocket.send(num)
print tcpsocket.recv(2048)
tcpsocket.close()
quindi questo sembra funzionare bene per un numero, ma quando inserisco il ciclo, mi chiede un secondo numero, ma poi ricevo questo errore
Enter number: 3
The number 3 is a prime number
Enter number: 2
Traceback (most recent call last):
File "./socketclient.py", line 14, in <module>
tcpsocket.connect( ("192.168.233.132", 8000) )
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
File "/usr/lib/python2.7/socket.py", line 170, in _dummy
raise error(EBADF, "Bad file descriptor")
socket.error: [Errno 9] Bad file descriptor
Sono abbastanza vicino ma ne ho bisogno per continuare a correre fino a quando l'utente non immette 0
qualche idea ?
risposte:
0 per risposta № 1Vedo due problemi.
Innanzitutto, il tuo server ne accetta solo unoconnessione, ma il tuo client sta cercando di stabilire una nuova connessione ogni volta attraverso il suo ciclo. Quindi la prima iterazione del ciclo funziona, ma il server non accetterà mai un'altra connessione. Potresti risolvere questo problema spostando il tuo tcpsocket.connect()
prima del ciclo, ma poi potresti imbatterti nel secondo problema.
Il secondo problema è che TCP invia i dati come flusso di byte. I dati possono essere ricevuti in blocchi di dimensioni diverse rispetto a quelli inviati. Ad esempio, se il tuo ciclo viene eseguito tcpsocket.send("3")
e poi tcpsocket.send("5")
, la chiamata del server a client.receive(2048)
potrebbe restituire "35". (Con il client che hai sopra, questo è improbabile a causa del ritardo nella chiamata send
a causa dell'utilizzo dell'input umano, ma del tuo servernon dovrebbe dipendere da questo.) Inoltre, un invio di "12345" potrebbe essere ricevuto come "123" e quindi "45". Per TCP, è necessario definire un protocollo per rilevare la fine di un messaggio. Utilizzo di un avanzamento di riga char come delimitatore è comune.