/ / manca solo qualcosa di piccolo da questo script socket del server client - python

manca solo qualcosa di piccolo da questo script del socket del server client - python

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 № 1

Vedo 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.