Пустой буфер входного потока из TcpSocket - PullRequest
0 голосов
/ 02 марта 2019

Мне нужно очистить буфер входного потока от соединения TcpSocket.Я попробовал это:

public void emptyReadBuffer(){
    try {
        while((DataInputStream)inFromServer.read()>=0) {}
    } catch (IOException e) {}
}

Но он ждет некоторого ввода до истечения времени ожидания ... Я просто хочу очистить буфер, потому что я обнаружил, что иногда я читаю грязные данные для предыдущего соединения.

1 Ответ

0 голосов
/ 02 марта 2019

Ваш фрагмент кода будет зацикливаться до тех пор, пока не произойдет исключение или пока сокет не закроется.

То, что вы хотите, невозможно, в зависимости от вашего определения «буфера».

Есливы говорите о реальных буферах на локальном оборудовании (например, сетевой карте и т. д.), вы можете сделать это, хотя фактическая спецификация поддержки TCP в Java не совсем гарантирует, что вы сможете это сделать.Тем не менее, это бессмысленно: новый сокет TCP просто не содержит случайных байтов от предыдущих подключений (это было бы серьезной утечкой безопасности, так что, да, людям было бы очень интересно, это была бы общедоступная информация).

Итак, я предполагаю, что вы на самом деле имеете в виду, что у вас есть одно долгоживущее TCP-соединение, которое используется для нескольких «сессий», и вы все еще берете байты из предыдущего сеанса.

Если последнее действительно происходит, то использование вами слова «буфер» вводит в заблуждение.Вы понятия не имеете, ГДЕ эти «случайные байты» находятся сейчас: возможно, они все еще застряли где-то в маршрутизаторе или в середине кабеля через Атлантику.Понятие «просто выбросить все байты, которые поступили на локальный компьютер» просто не охватит его.

Что вам действительно нужно, так это уникальное сообщение в духе «Здравствуйте, это началоsession ', а затем вместо этого ваш метод emptyReadBuffer должен выглядеть так: "ignoreAllUntilStartOfSession (String sessionId)".Это МОЖЕТ быть сделано и надежно избавится от предыдущего сеанса.

То, что ваш фрагмент пытается сделать и потерпеть неудачу, лучше всего сделать так:

inFromServer.skip(inFromServer.available());

Но, как я уже сказалэто ничего не дает надежно.Вы действительно, действительно не должны этого делать.Однажды он не сможет делать то, что вы хотите, потому что сети разнообразны и ненадежны.

...