Ошибка сокета Java: чтение строк из InputStream сокета

Я использую Socket для связи с ServerSocket. Строки отправляются с сервера на мой Socket. Каждая отдельная строка представляет собой сообщение, которое при анализе содержит информацию. Чтобы прочитать эти строки текста, используется сканер.

Проблема в том, что данные поступают «скачками». Хотя Сервер отправляет данные непрерывно и равномерно, данные, считанные Сканером на стороне клиента, кажется, приостанавливаются, читаются сразу в группе сообщений (30-40), а затем снова приостанавливаются. Этот цикл повторяется бесконечно.

Если я увеличиваю скорость, с которой отправляются данные, длительность пауз уменьшается; если я замедляю передачу данных (до 1 сообщения в секунду), ошибка сохраняется, и паузы становятся очень длинными. Это почти как если бы Socket ожидает переполнения своего буфера, прежде чем отправить какие-либо данные в Сканер; затем все смывает и снова ждет переполнения. Однако, если я уменьшу размер буфера Socket, ничего не изменится.

Следует отметить, что я использовал Scanner и Socket в этом методе раньше - со стороны сервера - и все работало, как нужно. Кроме того, я а) попробовал это с помощью BufferedReader, такого как Java Tutorials (без изменений в ошибке) и б) распечатал список передач сервера в файл и прочитал из файла таким же образом, и программа работала, как ожидалось (постоянная скорость приема сообщений и т. д.), так что проблема, похоже, в самом Socket.

Итак: Как исправить такое поведение? У меня нет идей, и я действительно не знаю, что происходит.

КОД (по запросу):

// In try block
// Makes the connection
Socket connection = new Socket(TARGET_MACHINE, PORT_NUMBER);
Scanner reader = new Scanner(connection.getInputStream());

// In new Thread
// In run()
while(!finished) // Boolean exit strategy
{
    if(reader.hasNextLine())
        Sring message = reader.nextLine();
}

Вот как я подключаю и извлекаю строки.

Кроме того, строки, которые я получаю обычно имеют длину 20-40 символов.

6
задан CodeBunny 13 June 2011 в 18:05
поделиться