尝试使用lrzsz通过java telnet服务器发送带有zmodem的文件

时间:2015-03-27 14:25:18

标签: java telnet zmodem

我正在尝试使用lrzsz通过读取java中的stdio并将其转发到连接客户端的套接字来通过zmodem发送文件。

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下载正在破坏。它出错了。

2 个答案:

答案 0 :(得分:1)

您标记了您的问题“telnet”,但您没有明确表示您正在使用telnet进行远程连接。

Telnet 8位清理。它使用“转义”字符在客户端和服务器之间交换配置信息。您的转移计划可能需要原始连接。

您可以尝试在您的应用中实施基本的Telnet支持。出于您的目的,它可能意味着只是转义和取消转义用于为Telnet命令添加前缀的IAC(0xFF)字符。 Telnet接口会将这些字节从原始流转换为网络中的双IAC字符,就像字符串中的“\\”一样,以获得单个反斜杠。

在网络接口上使用zmodem毫无意义 - 它是专为没有内置错误检测/纠正的串行线路而设计的。尽管我有时会使用scp程序(或rsync)来创建原始侦听端口,但sshsocket(使用netcat)是最好的选择。直接连接到那个传输文件。

机器1:socket -q -l 12345 <archive.zip

机器2:socket -q machine1 12345 >archive.zip

(命令是从内存中输入的,我不是严格准确的)

答案 1 :(得分: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 telnet选项占IAC角色,但我不确定lrzsz是否(可能没有),所以我添加了Brian关于逃避它们的建议。