2009-11-04 3 views
1
Process P = Runtime.getRuntime().exec("cmd /c start telnet");  
System.out.println("done running ..");  
OutputStream output = P.getOutputStream();  
BufferedOutputStream out = new BufferedOutputStream(output);  
String S = "open\n"; byte[] BS = S.getBytes(); 
out.write(BS); out.close(); 

Приведенный выше код не выполняет команду open под telnet.Как я могу выполнить команду open через telnet в Java?

Что я делаю неправильно?

+0

Ваш код пытается записать в * OutputStream *, а не в InputStream. – 2009-11-04 14:59:36

+0

@lutz: неверно писать в OutputStream. –

+2

Я думаю, ваш CAPS LOCK пошатнулся в середине потока. – OregonGhost

ответ

1

Откуда вы знаете? Поскольку вы не захватываете входной поток, вы никогда не увидите вывод (или ответ об ошибке) из приложения telnet. Вам действительно нужно подключить все три (выход, вход и ошибку), и вам, вероятно, нужен отдельный поток для чтения потоков ввода и ошибок. Это должно позволить вам добиться определенного прогресса в этой проблеме.

Поскольку вы не знаете заранее, сколько символов выходит из вашего входного потока (или вывода telnet), вы захотите прочитать только количество символов, заданных stream.available(), или просто чтение одного байта за раз, пока вы не получите -1.

+0

Вероятно, он запутался, так как 'getInputStream() процесса Process фактически возвращает поток, который имеет результат процесса. – Powerlord

+0

Это понятно. Я решил эту проблему примерно полдюжины раз, и я все еще * запутался в терминологии. Это немного неинтуитивно. –

1

Когда я запускаю свой код на моей машине, я получаю диалоговое окно ошибки Windows, указав

Не удается найти «телнет». Сделайте уверенным, что вы набрали имя правильно, и , затем повторите попытку.

Попробуйте заменить первую строку с

Process P = Runtime.getRuntime().exec("cmd /c C:\\Windows\\system32\\telnet.exe"); 
-1

Избавиться от BufferedOutputStream, это не полезно в этом контексте. Если вы думаете, что должен использовать, используйте его, по крайней мере, вам нужно flush().

+0

Я считаю, что close() неявно вызывает flush() .... – alasdairg

+0

@ammo: Nope. Закрыть будет автоматически очищаться. –

1

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

UPDATE: похоже, что Apache Commons Net имеет реализацию клиента Telnet. Мог бы попробовать попробовать.

0

Вместо того, чтобы запускать telnet в Runtime, вы можете запустить telnet из библиотек Apache Commons. Таким образом, вы напрямую работаете с telnet, а не с процессом, на котором работает telnet.

Смежные вопросы