/ / apenas faltando algo pequeno neste script de socket do servidor cliente - python

apenas faltando algo pequeno deste script de soquete do servidor cliente - python

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

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