• Как решить проблему с использованием сокетов в python?

    @lega
    Они не только могут склеиваться, но и разрываться в разных местах, например отправили 3 раза, получили 5 раз.
    В обычном http для этого создают отдельное подключение для отдельной передачи (одного файла).
    Ответ написан
    Комментировать
  • Как решить проблему с использованием сокетов в python?

    @nirvimel
    Я понял в чем суть проблемы только по одному описанию, еще не успев заглянуть в код (редко такое происходит). Вы понимаете в чем смысл единственного параметра у recv? Для чего вы передаете туда константу 1024? Это объем в байтах, который читается из сокета за один вызов. Сокет - это не очередь передаваемых пакетов, а поток байт, который наполняется с одной стороны через send и вычерпывается с другой через recv (флаг socket.SOCK_STREAM символизирует это). Если в некоторых случаях recv возвращает в точности тот же пакет фрагмент данных, который был передан за один вызов send, то только потому, что в потоке в этот момент нет других данных.
    Следовательно, если логика вашего клиент-сервера подразумевает обмен пакетами, то всю разбивку на пакеты вы должны реализовывать самостоятельно. Например, в заголовке каждого пакета передавать его длину, а после прочтения этого заголовка, читать из сокета ровно заданное количество байт.
    Все это издержки работы с голым TCP. Для решения как раз этих проблем и существуют специальные пакетные протоколы и библиотеки для работы с ними. Можете попробовать, например, ZeroMQ (через PyZMQ), если вас интересует именно обмен пакетами ( то есть "сообщениями" в терминах ZeroMQ) и нет желания писать этот велосипед самостоятельно.
    Ответ написан
    Комментировать