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