@DvorkinFromChaos

Как решить проблему с socket python (connection.close())?

Такое задание :
Создать сервер на сокетах, который 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" и соединение закрылось ? Буду рад любой помощи или подсказки .
  • Вопрос задан
  • 244 просмотра
Решения вопроса 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Сделать переменную на сервере - признак успешности. Сделать счетчик = 100.
Заменить цикл for i in range на цикл while со счетчиком с декрементом и проверкой признака успешности.
Признак успешности выставлять в False если попали в if.
В конце при печати сообщения успешности сделать проверку признака.

check = True
counter = 100
while check and counter > 0:
    counter -= 1
    …
    if int(answer) != int(count):
        connection.close
        …
        check = False
if check:
    print("У тебя получилось !!!\n")
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы