Задать вопрос
@sparr0w1

Как остановить спам «Пробелом» на сервере после закрытия клиента?

Сделал небольшой локальный чат, но после закрытие Клиентской части начинается спам "Пробелом" на сервере. Как это можно исправить?

server
host = socket.gethostbyname_ex(socket.gethostname())[-1][-1]
        port = 6677

        print(socket.gethostbyname_ex(socket.gethostname()))
        print(host)
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.bind((host, port))
            s.listen()
            while True:
                conn, addr = s.accept()
                while True:
                    data = conn.recv(1024).decode('utf-8').lower()
                    print(data)

client
import socket

HOST='192.168.0.13'
PORT= 6677

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))

    while True:
         s.send(input().encode('utf-8')
  • Вопрос задан
  • 84 просмотра
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
while True:
    data = conn.recv(1024).decode('utf-8').lower()
    print(data)

У тебя сервер вообще не предусматривает выхода из обслуживания клиента. Разве что по исключению, но тогда весь сервер грохнется.
Не проверяешь, получили ли хоть что-то. Если соединение закрыто, recv() вернёт bytes-объект нулевой длины. Так что проверяй длину, и если она нулевая - прерывай цикл.
Также в твоем коде ни сервер, ни клиент не предусматривают нормального завершения соединения. Если ты используешь TCP, то нужно вызвать метод s.shutdown(), чтобы дать другой стороне понять, что больше данных не будет, а потом s.close(), чтобы полностью закрыть соединение.
Для клиента нужно будет определить условие, когда закрывать соединение. Например, если пользовать в ответ на input() ввёл пустую строку.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы