Ошибка Java Socket: чтение строк из Socket's InputStream - PullRequest
6 голосов
/ 10 июня 2011

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

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

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

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

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

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

// 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 символов.

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

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

2 голосов
/ 10 июня 2011

Возможно, вы используете readLine для чтения данных?

Вот выдержка из Javadoc, которая может быть вам интересна:

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

Можете ли вы присоединить код клиента и сервера, чтобы увидеть, что не так? Было бы хорошо, если бы вы использовали очень простое средство считывания байтов за байтом, чтобы проверить, является ли поток с сервера паузами в транспорте, возможно, проблема в том, как вы записываете данные в сокет сервера ... без кода трудно угадать :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...