2015-03-27 3 views
0

Я пытаюсь использовать lrzsz для отправки файла по zmodem путем чтения stdio в java и пересылки его в сокет подключенного клиента.Попытка отправить файл с помощью zmodem с помощью lrzsz через java telnet server

private void sendFiles(ArrayList<String> filenames) { 
    Process p; 
    ProcessBuilder pb; 

    filenames.add(0, "/opt/local/bin/sz"); 

    try { 

     pb = new ProcessBuilder(filenames); 

     p = pb.start(); 

     InputStreamReader lrzszin = new InputStreamReader(p.getInputStream()); 
     OutputStreamWriter lrzszout = new OutputStreamWriter(p.getOutputStream()); 

     InputStreamReader telnetin = new InputStreamReader(socket.getInputStream()); 
     OutputStreamWriter telnetout = new OutputStreamWriter(socket.getOutputStream()); 


     while (p.isAlive()) { 
      if (lrzszin.ready()) { 
       telnetout.write(lrzszin.read()); 
       telnetout.flush(); 
      } 
      if (telnetin.ready()) { 
       lrzszout.write(telnetin.read()); 
       lrzszout.flush(); 
      } 
     } 


    } catch (IOException ex) { 

    } 
} 

Однако zmodem загружается через поврежденный. и он ошибается.

ответ

0

Отвечая на мой собственный вопрос ...

мне нужно чтобы добавить правильные кодировки символов во входные и выходные потоки.

 BufferedReader lrzszin = new BufferedReader(new InputStreamReader(p.getInputStream(), "ISO-8859-1")); 
     BufferedWriter lrzszout = new BufferedWriter(new OutputStreamWriter(p.getOutputStream(), "ISO-8859-1")); 

     BufferedReader telnetin = new BufferedReader(new InputStreamReader(socket.getInputStream(), "ISO-8859-1")); 
     BufferedWriter telnetout = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "ISO-8859-1")); 

Хотя вариант SEXYZ телнет счетов для персонажей IAC, я не уверен, что если lrzsz делает (вероятно, нет), так что я добавил предложение Брайана о спасаясь их.

1

Вы отметили свой вопрос «telnet», но вы явно не говорите, что используете telnet для удаленного подключения.

Telnet is не 8-bit clean. Он использует символы «escape» для обмена информацией о конфигурации между клиентом и сервером. Вероятно, ваша программа передачи ожидает необработанное соединение.

Вы можете попробовать внедрить базовую поддержку Telnet в свое приложение. Для ваших целей это, вероятно, означает просто экранирование и отказ от символа IAC (0xFF), который используется для префикса команд Telnet. Интерфейсы Telnet превратят эти байты из необработанного потока в двойные символы IAC в сети, как «\\» в строке, чтобы получить обратную косую черту.

Нет смысла использовать zmodem поверх сетевых интерфейсов - он был разработан для последовательных линий, у которых не было встроенного обнаружения/коррекции ошибок. scp или rsync (который использует ssh) - ваши лучшие ставки, хотя я иногда использую программу socket (или netcat), чтобы создать необработанный порт прослушивания и напрямую подключиться к нему для передачи файлов.

машина 1: socket -q -l 12345 <archive.zip

машина 2: socket -q machine1 12345 >archive.zip

(команды набираются из памяти и мои не быть строго точными)

+0

Это для telnet BBS. Я просто попробовал SEXYZ из пакета Synchronet BBS, у которого есть опция telnet и опция stdio, но все же она не работает. И это говорит «через сервер telnet java» в моем заголовке вопроса. –

+0

Последним вариантом было бы реализовать протокол Telnet в вашем коде. Это должно быть довольно просто для ваших целей; Я обновлю ответ. –

+0

Я решил это .. Кажется, мне нужно было установить правильные кодировки символов для моих читателей и писателей. –

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

  • Нет связанных вопросов^_^