буферный ридер не получает данные из сокета - PullRequest
5 голосов
/ 15 июня 2011

Я пишу клиентское приложение, которое будет получать непрерывный поток данных через tcp / ip. У меня проблема в том, что буферизованный объект чтения не получает никаких данных и зависает в методе readline.

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

socket = new Socket(strHost, port);
authenticate();
inStream = new BufferedReader(new InputStreamReader(socket.getInputStream()));
process(inStream);

authenticate()
{      
  PrintWriter pwriter = new PrintWriter(socket.getOutputStream(), true);
  pwriter.println(authString);
}

process(BufferedReader bufferedReader)
{
   while((line = bufferedReader.readLine()) != null)
      dostuff
}

Я создал пример серверного приложения, которое отправляет данные способом (я думаю), когда сервер отправляет данные, и он подключается, а также получает и обрабатывает данные. Я могу подключиться к серверу нормально в моем приложении. Я также могу telnet к серверу и написать строку аутентификации и получить поток данных, используя telnet. Однако мое приложение просто висит на readLine с сервером, и я не знаю, почему.

Данные, поступающие (по крайней мере через telnet), выглядят как непрерывный поток следующего:

 data;data;data;data;data
 data;data;data;data;data

Почему мое приложение висит на readline, неправильно ли я вывожу строку аутентификации? Я не получаю никаких ошибок ...

EDIT Мой пример кода сервера (который работает правильно) ... опять же, это только имитирует способ Я думаю настоящий сервер работает, но я могу подключиться к обоим в моем приложении, просто нет получать данные с реального сервера.

  public static void main(String[] args) throws IOException
  {
  ServerSocket serverSocket = null;

  try
  {
     serverSocket = new ServerSocket(1987);
  }
  catch (IOException e)
  {
     System.out.println("Couldn't listen on port: 1987");
     System.exit(-1);
  }

  Socket clientSocket = null;
  try
  {
     clientSocket = serverSocket.accept();
  }
  catch (IOException e) {
     System.out.println("Accept failed: 1987");
     System.exit(-1);
  }

  PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
  BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
  String something;

  while ((something = in.readLine()) != null)
  {
     while(true)
     {
        out.println(message);
     }
  }



  out.close();
  in.close();
  clientSocket.close();
  serverSocket.close();
}

Ответы [ 3 ]

11 голосов
/ 15 июня 2011

Во-первых, вы должны позвонить BufferedReader.ready() перед вызовом readLine(), поскольку ready() скажет вам, можно ли читать.

PrintWriter не вызывает исключение ввода-вывода, поэтому записьвозможно, потерпел неудачу без вашего ведома, поэтому читать нечего.Используйте PrintWriter.checkError(), чтобы увидеть, что во время записи что-то пошло не так.

Вы должны настроить входной и выходной потоки на Socket одновременно, прежде чем записывать что-либо по каналу.Если ваш читатель не готов, когда другой конец попытается написать, вы получите сломанный канал на сервере и больше не будете отправлять данные.Telnet настраивает чтение и запись до того, как вы что-либо написали или прочитали.

Вы можете использовать Wireshark , чтобы определить, действительно ли сервер отправляет данные.

9 голосов
/ 15 июня 2011

BufferdReader.readLine() читает строки, то есть последовательности символов, оканчивающиеся на \r или \r\n.Я предполагаю, что ваш сервер записывает свои выходные данные в одну строку.Ваш вывод telnet подтверждает это предположение.Просто используйте PrintWriter.println() на стороне сервера.

0 голосов
/ 07 апреля 2014

это работа со мной с розеткой без промывки

void start_listen()
   {
       String    result1="";
       char[] incoming = new char[1024];
       while (!s.isClosed())
       {
           try {

           int lenght  =  input.read(incoming);
               result1 = String.copyValueOf(incoming,0,lenght);


           }
           catch (IOException e)
           {
               e.printStackTrace();
           }
           Log.d("ddddddddddd",result1);

       }
...