Такое задание :
Создать сервер на сокетах, который 100 раз отсылает клиенту одномерный массив из 20-разрядных чисел, и клиента, который должен посчитать количество элементов массива с четным количеством цифр, и отправить результат серверу. Сервер каждый раз проверяет ответ, если правильно, то дает следующий массив, если нет, то ругается и прекращает работу. Когда 100-й правильный ответ отправлен, сервер присылает приветствие.
Вот мой код для сервера:
import socket
import random
def recvuntil(s, pattern):
result = b""
while pattern not in result:
result += s.recv(1)
return result
server_address = ('0.0.0.0', 9090)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(server_address)
server_socket.listen(20)
print('server is running, please, press ctrl+c to stop')
connection, address = server_socket.accept()
print("new connection from {address}".format(address=address))
task = "Тебе необходимо посчитать кол-во элементов массива с четным количеством цифр и отправить обратно.И так 100 раз! Удачи :D \n"
connection.send(task.encode())
for i in range(100):
a = [(str(random.randint(10000000000000000000,99999999999999999999))+str(round(random.random(),random.randint(1,15)))[1:]) for _ in range(random.randint(3, 7))]
#Да,это странно
r2 = f"Array {i+1}: {' '.join(map(str,a))}\n"
connection.send(r2.encode())
r3 = "Answer >> "
connection.send(r3.encode())
count = 0
for foo in a:
b=foo.replace(".","").strip()
if len(b)%2 == 0:#проверка на чётность
count+=1
answer = recvuntil(connection,b"\n").decode().strip()
if int(answer) != int(count):
r4 = "WRONG *-* \n"
connection.send(r4.encode())
connection.close()
r5="У тебя получилось !!!\n"
connection.send(r5.encode())
connection.close()
Вот код для клиента :
import socket
def recvuntil(s, pattern):
result = b""
while pattern not in result:
result += s.recv(1)
return result
HOST = '127.0.0.1'
PORT = 9090
cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cli.connect((HOST,PORT))
data = cli.recv(1024).decode()
print(data)
for i in range(100):
array = recvuntil(cli, b">>").decode().strip().split("\n")[:-1]
array1 = " ".join(array)[8:]
array1 = array1.split(' ')
array1 = array1[1:]
count = 0
for foo in array1:
b=foo.replace(".","").strip()
if len(b)%2 == 0:#проверка на чётность
count+=1+1# это специально, чтобы вызвать ошибку
answer = str(count)+"\n"
cli.send(answer.encode())
print(cli.recv(1024).decode())
print(cli.recv(1024).decode())
В целом код работает, но если сломать правильность(то есть зайдет в if ), то connection.close() не работает и цикл дальше отрабатывает. В этом и есть проблема, как мне сделать, чтобы клиенту выдало только сообщение "WRONG *-* \n" и соединение закрылось ? Буду рад любой помощи или подсказки .