Я начал кодировать клиент Minecraft с помощью Python. Я закодировал рукопожатие, логин и т. Д. c. но я не могу написать код, который получает сжатые пакеты (или я думаю).
Мой клиент получает каждый пакет. Если пакет является пакетом проверки активности, он отвечает. Но есть проблема. Когда он получает пакет подтверждения активности, он всегда большой. Я смотрю на исходный размер пакета, и он говорит, что в моем пакете 60 КБ дополнительных байтов. Сервер кикает из-за лишних байтов.
Я удалил свой код и написал еще один. Это работает, но это неправильно. Потому что он только редактирует пакет и отправляет на сервер. Я смотрю на размер отправленного пакета, и он снова больше 60 КБ.
Я ничего не понял. Я только читаю документацию и преобразовываю ее в код.
Документация: https://wiki.vg/Protocol#With_compression
Мой код (позади много функций, они делают то, что я написал):
# socket and threshold variables are defined before
# getvarint => receives the first valid varint from given socket
# recvall => receives as much as given
# encode => encodes as varint
# decompress => zlib.decompress
while True:
datalen = getvarint(socket.recv)
data = recvall(socket.recv, datalen)
uncompressedlen = getvarint(data)
data = data[len(encode(uncompressedlen)):]
if uncompressedlen > 0:
if uncompressedlen < threshold:
socket.close()
print('Closed')
exit()
data = decompress(data)