Я работаю над онлайн-игрой, и я столкнулся с небольшим затруднением, работая над серверной стороной.
При использовании неблокирующих сокетов в Java, как лучше всего обрабатывать полные наборы пакетных данных, которые невозможно обработать, пока не будут доступны все данные? Например, отправка большой двумерной мозаичной карты через сокет.
Я могу придумать два способа справиться с этим:
Выделите ByteBuffer, достаточно большой, чтобы обработать полный набор данных, необходимый для обработки большой двумерной мозаичной карты из моего примера. Продолжайте добавлять прочитанные данные в буфер, пока все они не будут получены и обработаны оттуда.
Если ByteBuffer имеет меньший размер (возможно, 1500), последующие чтения могут быть выполнены и помещены в файл, пока он не будет полностью обработан из файла. Это исключает необходимость иметь большие байтовые буферы, но снижает производительность из-за дискового ввода-вывода.
Я использую выделенный ByteBuffer для каждого SocketChannel, чтобы я мог продолжать считывать данные, пока они не будут завершены для обработки. Проблема в том, что если моя 2D Tiled Map имеет размер 2 МБ, то действительно ли целесообразно использовать 1000 2 МБ байтовых буферов (при условии, что 1000 - это ограничение клиентского подключения, и все они используются)? Должен быть лучший способ, о котором я не думаю.
Я бы предпочел, чтобы все было просто, но я открыт для любых предложений и ценю помощь. Спасибо!