0

我正在尝试使用 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 下载是通过损坏来的。它出错了。

4

2 回答 2

1

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

Telnet不是8 位干净的。它使用“转义”字符在客户端和服务器之间交换配置信息。您的传输程序可能需要原始连接。

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

在网络接口上使用 zmodem 毫无意义——它是为没有内置错误检测/纠正的串行线路设计的。 scpor rsync(使用ssh)是您最好的选择,尽管我有时使用socket程序(或netcat)来创建原始侦听端口并直接连接到该端口以传输文件。

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

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

(命令是从记忆中输入的,我并不完全准确)

于 2015-03-27T15:38:40.577 回答
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 的转义它们的建议。

于 2015-03-27T21:36:52.620 回答