Я использую клиент 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 .. и т. д.)
Не : приведенный выше код не является полной копией.но это упрощенная часть рабочего.Полная версия разделяет прослушивание, отправку команд и обработку исключений в распределенной форме.