Не могу получить ответ от сервера Telnet на Android - PullRequest
1 голос
/ 20 июня 2011

Мне нужно реализовать простой клиент Telnet на Android.Я пытался использовать org.apache.commons.net.telnet.TelnetClient класс:

TelnetClient telnet = new TelnetClient();

telnet.connect( "localhost", PORT);

InputStream inStream = telnet.getInputStream();
PrintStream outStream = new PrintStream( telnet.getOutputStream());

outStream.println( COMMAND);
outStream.flush();

int ch = 0;
while( ( ch = inStream.read()) != -1) {
    log("Respose:" + ch);
}

, но inStream.read() блоков.

В то же время я могу получить ответ от сервера, используя приложение Telent от Market.

Есть идеи, что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 20 июня 2011

Я думаю, что не используйте localhost, вместо этого используйте IP-адрес конкретной машины.

0 голосов
/ 20 мая 2015

Я использую клиент Apache Telnet, и у меня была такая же проблема.причина в том, что сервер telnet выполняет потоковую передачу ответа, а токен END отсутствует.что-то вроде конца строки .. и т. д.

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

Поэтому я использовал StringBuilder, чтобы сохранить все входящие байты как символы, а также сохранитьотслеживание определенной строки (": / #"), которая всегда находится в конце передаваемого потока (для подключения через telnet).Даже при первом подключении.

Это часть кода, который я использовал.

StringBuilder builder = new StringBuilder();
TelnetClient telnet = new TelnetClient();
telnet.connect("127.0.0.1", 23);
outstr = telnet.getOutputStream();
instr = telnet.getInputStream();
int cnt =0;
    while(isConnected){
        if(builder.toString().endsWith(":/ #")){
                cnt++;
                if(cnt==2){
                    Log.i("DATA : ", builder.toString());
                    builder.delete(0, builder.length());
                    cnt=1;
                }
        }
        builder.append((char)instr.read());

    }

, если вы заметили, что компоновщик очищается, если счетчик "cnt" достигает 2. и счетчик установлен в 1. "cnt" показывает номер токена (": / #"), который я выбираю для определения конца потока.

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

Предложение: сохраняйте код прослушивания в другом потоке и код отправки команд в другом.(в конце концов, из-за Android вам нужно обработать networkOnMainThread .. и т. д.)

Не : приведенный выше код не является полной копией.но это упрощенная часть рабочего.Полная версия разделяет прослушивание, отправку команд и обработку исключений в распределенной форме.

0 голосов
/ 20 июня 2011

Блокируется ли он после некоторых символов? Потому что вы просите его прекратить чтение только тогда, когда достигнут конец inputStream.

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

...