@wintreist

Как в socket проверить, отправил ли сервер/клиент что-то еще?

Здравствуйте, работаю над клиент-серверным приложением, и столкнулся с такой проблемой. Нужно как-то сделать, чтобы клиент/сервер был уверен, что все данные были отправлены. То есть например, сервер принимает данные по 1024 байта(либо бита, простите) и сохраняет их в переменную, мне нужно как-то удостовериться, что клиент слал что-то что меньше 1024 байтов, либо если больше, и отправились не все, то принял их, и дописал к предыдущим принятым байтам. А если клиент слал два, или больше, разных данных, как-то определить, что они все разные. Я не представляю, как такое сделать. На сайте документации модуля socket есть такой код
while True:
    data = sock.recv(1024) #где sock = socket.socket()
    if not data: break

Только когда цикл снова пытается sock.recv, программа уходит в бесконечность, ожидая пока ей снова данные отправят...
Даже не знаю, будет ли на мой вопрос ответ, поэтому может есть какие-нибудь удобные библиотеки для работы клиент-сервера?
Но я бы все-таки предпочел поработать с сокетами
  • Вопрос задан
  • 1012 просмотров
Пригласить эксперта
Ответы на вопрос 3
tumbler
@tumbler Куратор тега Python
бекенд-разработчик на python
Если кратко, то проблема решается на уровне протокола приложения.
Примеры:
  • HTTP-протокол указывает Content-Length, раздел заголовков заканчивается \r\n\r\n.
  • У редиса в начале каждого поля идет его длина.
  • Транспорты видео (не помню какой именно) используют "магическую последовательность байт" чтобы один пакет от другого отличать.
Ответ написан
Комментировать
Вы можете попробовать другие режимы работы с сокетом - установить таймауты или неблокирующий режим. В обоих случаях при невозможности прочитать из сокета вы получите exception, который можно отловить и обработать.
Ответ написан
Комментировать
создайте свой протокол. к примеру
сообщение со стороны клиента и сервера должно быть структурированым
key|length|data|crc
key - хеш ключ, на основании которого вы валидируете что клиент действительно ваш. длинна всегда к примеру 15 знаков
length - длинна блока дата, всегда 10 знаков
data - блок с данными, длинна равна значению length
crc - контрольная сумма блока data, для проверки целостности пакета, всегда 4 знака
при таком подходе Вы всегда знаете какой длинны Вам придут данные и что собственно ожидается
вобщем socket это весело :)
Ответ написан
Ваш ответ на вопрос

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

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