2012-04-10 2 views
0

Im пытается отправить команду через телнет на мой компьютер, который затем посылает команду к последовательному порту, при использовании телнета с помощьюTelnet. Android, вишу на посыле

adb shell 
$telnet 172.20.104.203 5334 
$h 

возвращает данные из команды ч, как никогда когда я пытаюсь сделать это, используя android, он подключается к сокету, я могу видеть это на компьютере, он отправляет команду, но затем, как только он регистрирует, что он отправил, он зависает и появляется «Приложение не отвечает», и оно имеет ожидание или усилие близко, и если я жду, он останется прежним.

Это мой код для телнет части

private static final int TCP_SERVER_PORT = 5334; 

    private void runTcpClient() { 
     try { 
      Socket s = new Socket("172.20.104.203", TCP_SERVER_PORT); 
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 
      //send output msg 
      String outMsg = "$getPos"; 
      out.write(outMsg); 
      out.flush(); 
      Log.i("TcpClient", "sent: " + outMsg); 
      //accept server response 
      String inMsg = in.readLine() + System.getProperty("line.separator"); 
      Log.i("TcpClient", "received: " + inMsg); 
      //close connection 
      s.close(); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

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

$getPos 

вместо этого он все еще висит.

Кто-нибудь знает, что может случиться?

ответ

0

Я не знаком с деталями платформы, но маловероятно, что readline будет работать на потоке сокета/tcp, или если он работает, он будет работать неудовлетворительно. Данные, поступающие из сокета, не обязательно организованы в «строки», а вместо этого пакеты определенного размера. «Чтение», выполняемое в сокете, вернет некоторое количество байтов.

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

Вы показали нам клиентскую часть вашего кода. У вас есть соответствующая сторона сервера?

От того, что у вас есть, мой догадка заключается в том, что ваш клиентский код терпеливо ждет «конца строки», который по какой-то причине никогда не придет. ИЛИ что-то не так на сервере, и сервер не отправляет данные клиенту.

+0

Случилось так, что читателю еще не было ничего, чтобы прочитать, мне нужно было заменить это на некоторое время (in.ready() && (line = in.readLine())! = Null) только для строки сделайте это, в то время как у читателя есть данные, которые нужно прочитать, это получилось прекрасным, в конце каждой строки данных в терминах фактических строк его ждет разделитель строк – FabianCook

+0

. Я забыл упомянуть, что вам нужно проверить, есть ли в потоке данные, которые нужно получить. :) – Iain

+0

Да: D, я закончил проект, в котором я нуждался, для: D участвовал в передаче проходящих данных. – FabianCook