Мой вопрос похож на этот пост. Но я отправляю не длину пакета, а 0 байт в конце. Наиболее эффективный способ чтения в потоке TCP в Java
Так что мне интересно, как бы я мог написать что-то подобное.
На данный момент я просто использую
this.socketIn = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
String line = this.socketIn.readLine();
Если пакет отправляется в то время, когда вы рассылаете спам, он будет считать пакет, который еще не прибыл, как полностью прочитанную строку, но она неполная и нарушает работу всего протокола.
В моем протоколе каждый пакет заканчивается байтом 0 (0x00), чтобы определить конец одного пакета, если в случае, если пакеты будут объединены / сложены вместе.
Итак, что я действительно пытаюсь сделать, это продолжать читать поток сокета до тех пор, пока не будет достигнуто значение 0x00, чтобы указать, что пакет полностью создан и готов к обработке ... и, конечно же, какую-то безопасность (я считаю, что лучше всего использовать тайм-аут) для определения пакет является нежелательным, поскольку он не заканчивается нулевым байтом в определенном временном интервале, допустим, 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
}