Мой вопрос похож на этот пост.Но я не посылаю длину пакета, а 0 байт в конце. Самый эффективный способ чтения в потоке tcp в Java
Так что мне интересно, как бы я закодировал что-нибудь такое.
На данный момент я просто использую
this.socketIn = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
String line = this.socketIn.readLine();
Если пакет отправляется во время рассылки спама, он будет считать пакет, который еще не поступил, как полностью прочитанную строку, но он не завершен и испортил весь протокол.
В моем протоколе каждый пакет заканчивается 0 байтом (0x00), чтобы определить конец одного пакета, если в случае, когда пакеты в конечном итоге объединены / сложены вместе.
Итак, что я пытаюсь сделать на самом делепродолжать читать поток сокетов до тех пор, пока не будет достигнуто значение 0x00, чтобы указать, что пакет полностью обработан и готов к обработке ... и, конечно, некоторая защита (тайм-аут лучше, я считаю) для определения того, что пакет является нежелательным, поскольку он не завершен в0 байт за определенный промежуток времени, скажем, 5 секунд.
Как бы я поступил так?
PS> Я не использую инфраструктуру NIO, а просто обычный поток для каждого сокета подключения, и я не хочу переключаться на NIO, поскольку очень трудно внедрить данные в совершенно другой глобальный поток, который обрабатывает обновления иотправляет конкретные обновления случайным пользователям (не транслируется).
Вот что я пробовал до сих пор.
String line = "";
int read;
long timeOut = System.currentTimeMillis();
while(true) {
read = this.socketIn.read();
if (read == -1 || read == 0 || (System.currentTimeMillis()-timeOut) > 5000)
break;
line += read
}