@happyjuic

Почему я получаю пустую строку?

Несколько дней бьюсь над этим кодом. Если очень просто клиент и сервер отправляют пак из двух сообщений, первое - длина сообщения. Второе - само сообщение. Но сервер упорно вместо строки букв, дает мне строку пробелов.

Метод .send клиента:
(я отправляю строку "Hello! Bust")
def send(msg: str, client: socket.socket):
    msg_length = len(msg)
    send_length = str(msg_length).encode(FORMAT)
    send_length += b' ' * (HEADER - len(send_length))  # Заполнение пробелами
    log(f"Отправляем длину: {send_length.decode(FORMAT)}")
    client.send(send_length)
    client.send(msg.encode(FORMAT))
    log(f"Отправляем сообщение: {msg}")


Метод .receive() сервера
def receive(conn: socket.socket):
    # Получение длины сообщения
    msg_length = conn.recv(HEADER).decode(FORMAT).strip()  # Убираем пробелы
    if msg_length.isdigit():
        msg_length = int(msg_length)
        log(f"Полученная длина: {msg_length}")
        msg = conn.recv(msg_length).decode(FORMAT)
        log(f"Полученное сообщение: {msg}")
        return msg
    else:
        return None


В консоли я вижу, что сервер четко уловил длину сообщения: 11 байт. И соотвественно принимает сообщение длиной 11 байт. Но вместо букв я вижу просто 11 пробелов. В чем может быть проблема?
  • Вопрос задан
  • 51 просмотр
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
send_length += b' ' * (HEADER - len(send_length))
Я не вполне понял, но зачем ты сразу после длины сообщения дописываешь пробелы?
Да ещё с ориентировкой на длину строкового представления длины сообщения?
Не говоря уже о том, что ты фиксируешь длину сообщения в символах, а передаёшь сообщение в байтах в некоторой кодировке... а ведь есть многобайтовые кодировки, типа utf-8. Там эти длины не будут совпадать, и более того, две строки одной длины в символах могут иметь разную длину в байтах, и наоборот.
Ну и до кучи, ты передаёшь длину сообщения как строку. А как ты определишь длину этой строки?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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