"Если приложение Java записывает данные в поток или существует резерв данных (приложение Java будет передавать данные довольно быстро.), Как я могу убедиться, что я читаю только один пакет данных за раз? «
Будьте осторожны, чтобы не предполагать, что у вас есть какой-либо контроль над тем, какие данные попадают в какой пакет. Если вы попытаетесь отправить байтовые данные { 'H', 'e', 'l', 'l', 'o' }
, нет гарантии, что все эти данные будут отправлены в одном пакете. Хотя это крайне маловероятно, все же возможно, что каждый пакет может содержать только один байт, поэтому вы получите все пять байтов в 5 различных событиях. Дело в том, что не полагайтесь на пакеты таким образом. Вместо этого определите свои собственные терминаторы End Of Message и просто сбросьте все входящие данные в некоторый байтовый буфер, и у вас есть другая функция, обнаруживающая, присутствует ли какой-либо из этих терминаторов. Если так, то читайте до этого терминатора. Например, вы дважды вызываете соответствующий метод send из вашего Java-приложения, содержащий следующие данные:
{ 'H', 'e', 'l', 'l', 'o', '\0' }
{ 'W', 'o', 'r', 'l', 'd', '\0' }
То, как ваша заявка должна быть подготовлена для получения данных, должно выглядеть примерно так:
Server receives { 'H', 'e', 'l' }
Data stored in byte buffer { 'H', 'e', 'l' }
Check byte buffer for message terminator '\0'. None found. Buffer unchanged, no message processed.
Server receives { 'l', 'o', '\0', 'W' }
Data stored in byte buffer { 'H', 'e', 'l', 'l', 'o', '\0', 'W' }
Check byte buffer for message terminator '\0'. 1 found, extracted message { 'H', 'e', 'l', 'l', 'o' } and buffer updated { 'W' }
Так что, хотя это был не совсем ответ на ваш первоначальный вопрос, я думаю, что это должно дать вам толчок в правильном направлении.
Одна вещь, с которой вы можете столкнуться, заключается в том, что просто нет символов, которые не могли бы быть данными вместо терминаторов сообщений. Например, многие файлы содержат данные \ 0, поэтому они могут испортить ваше сообщение. Обычно это выполняется путем создания спецификации заголовка для вашего протокола и определения того, ожидаете ли вы заголовок (в этом случае поиск \ 0 будет означать конец сообщения) или если вы ожидаете определенного количества данные (которые могут быть указаны последним полученным заголовком.) Если это не имеет смысла, и вы считаете, что вам может понадобиться использовать эту технику, сообщите мне, и я добавлю к этому ответу.