aqui está o que eu preciso fazer
Escreva programas python que usam o módulo de soquete.Escreva um cliente e um servidor. O cliente lerá um inteiro e enviará esse inteiro para o servidor. O servidor testará se o inteiro é primo e retornará True ou False para o cliente. O servidor também imprimirá que recebeu o número inteiro e que número inteiro recebeu. O cliente irá então relatar (por exemplo) “Os servidores dizem que 17 é primo” ou “Os servidores dizem que 18 não é primo” O cliente então pede outro número inteiro para testar. Isso continua até que o usuário insira 0.
e aqui está o que eu tenho até agora
script de servidor
#!/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)
lado do 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()
então isso parece funcionar bem para um número, mas quando coloco no loop, ele pede um segundo número, mas recebo este erro
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
Estou perto o suficiente, mas preciso continuar em execução até que o usuário digite 0
alguma ideia ?
Respostas:
0 para resposta № 1Eu vejo dois problemas.
Primeiro, seu servidor está aceitando apenas umconexão, mas seu cliente está tentando fazer uma nova conexão a cada vez por meio de seu loop. Portanto, a primeira iteração do loop funciona, mas o servidor nunca aceitará outra conexão. Você pode consertar isso movendo seu tcpsocket.connect()
antes do loop, mas então você pode encontrar o segundo problema.
O segundo problema é que o TCP envia dados como um fluxo de bytes. Os dados podem ser recebidos em blocos de tamanhos diferentes dos enviados. Por exemplo, se o seu loop for executado tcpsocket.send("3")
e depois tcpsocket.send("5")
, a chamada do servidor para client.receive(2048)
poderia retornar "35". (Com o cliente que você tem acima, isso é improvável devido ao atraso na ligação send
devido ao uso de dados humanos, mas seu servidornão deveria depender disso.) Além disso, um envio de "12345" poderia ser recebido como "123" e depois "45". Para TCP, você precisa definir algum protocolo para detectar o fim de uma mensagem. Usando uma alimentação de linha char como delimitador é comum.